2013-11-15 57 views
10

我正在研究基於html的計算器,並且我想渲染一個表達式,然後對其進行評估,並且所有這些都必須在Javascript中完成。我更喜歡用LaTeX編寫表達式,並且可以交互地編輯呈現的表達式,但其他語言可以工作。使用Javascript評估膠乳數學

我之前嘗試的是使用MathQuill交互式呈現表達式,然後使用MathJS對其進行評估。然而,這在某種程度上是有效的,因爲兩個包的設計目標不同(MathQuill渲染LaTeX,而MathJS有自定義的數學語法),但它不能很好地工作(例如,如果用戶鍵入\frac{5}{17*x}並假定它是正確的語法,然後評估它並從MathJS中得到一個錯誤)。

目前,我看到三種方式進行:(?也許切換到MathJax-哪個更好)

  • 繼續與我有什麼。
  • 查找工具,做兩渲染和評估(無論是在乳液或其他語言)
  • 找到兩個工具的渲染和密切評估(如果不相同)的語法
  • 寫我自己的渲染和評估工具,建議使用here。我寧願不這樣做,因爲它看起來很乏味,而且我不想重新發明輪子。

什麼是韌皮方式做到這一點?

更新1:通過查看altJS可用替代語言列表後,我想我可以使用Python,Ruby或Basic作爲用戶輸入的語言。如果我這樣做了,它會爲渲染提供很多可能性(從技術上講,它不是「渲染」,但只是想想那裏有多少個語法輪廓線)。但是,我不希望用戶訪問這些語言的更高級元素,因爲這會給我的用戶帶來困惑,也可能是不安全的(例如使用eval)。我只希望用戶能夠使用數學運算,變量(僅限於我指定的那些,也可以由用戶創建的變量)和函數(僅限那些我指定可以使用,也可以由用戶定義的函數)。有沒有辦法限制可以使用的語言子集?

更新2:我看了看周圍的一些altJS頁的詳細,並發現幾乎所有的語言被設計成編譯語言XYZ爲JavaScript,然後在網頁上運行的JavaScript,而不是運行語言XYZ 在頁面上。我沒有看過每一個,但他們大多數似乎是這樣的。其他人,比如Brython,似乎被設計成在瀏覽器中運行XYZ語言,但是作爲JavaScript的替代/補充,而不是作爲用戶的輸入語言。是否有一些解決方法,所以我可以使用這些方法作爲輸入?

更新3:感謝@SpaceDog提供的信息,並指出我沒有具體說明用戶應該能夠實現的功能。所以,在這裏就是我想實現的功能:

  1. 基本操作(加法,減法,乘法,除法/分數,冪,根,模量)
  2. 函數(三角函數,日誌等。)
  3. 常量(例如,PI等)
  4. 變量(分配,再分配,以及使用它們)
  5. 用戶定義的函數

LaTeXCalc似乎滿足所有這些要求,除了最後一個。此外,它似乎不在Javascript中。

這使我想到了另一個想法:使用類似MathJax的表示,然後使用Wolfram Alpha API實際處理計算。好處是它可以爲輸入和輸出提供更高級的選項。但是,應用程序將變得毫無用處(爲什麼不使用wolframalpha.com,如果計算器實際上只是一個克隆?),它會花錢,並且該應用程序無法脫機工作(這是一個桌面應用程序,用HTML編寫/ CSS/JS)。關於這個的想法?

+0

也許我對[this](http://stackoverflow.com/a/42232776)類似問題的回答可能有幫助。 – Jeff

回答

5

看來你想做兩件獨立的事情,很好地顯示公式和評估它。所以你需要一個兼具兩者的工具。乳膠更注重展示而不是評估,儘管可以至少對其子集進行評估(參見本答案:Is there a calculator with LaTeX-syntax?)。

很多這取決於你想要使計算器有多複雜 - 你想要允許什麼操作。如果你使用的是一個小的子集(聽起來就像你一樣),手動編寫轉換器會非常容易。我會研究MathML,它具有表示和語義標記 - 以及許多可用的工具。但它可能不是您的用戶最容易掌握的。

如果用戶對乳膠很熟悉,並且包含的​​符號的子集很小,那麼將乳膠分析成可以直接評估的格式就足夠簡單了。

我認爲您需要準確定義您允許用戶訪問的內容,以便任何人都能提供有關「最佳」的更好示例。

編輯 - 響應您的更新

嗯,你危險地接近寫一個完整的編程語言(你所需要的條件和循環 - 或標籤)。所以重新發明輪子聽起來不是一個好主意。在這種情況下,我絕對不認爲你需要LaTeX作爲你的輸入語言,理想情況下你想讓你的用戶更熟悉一些東西。

下面是我會做什麼,並在那裏我會開始,如果打算這樣做,這不是一個明確的答案,並開始,以確保我不會重複勞動之前,我會做更多的研究。

我會構建一個需要JavaScript子集的解析器,這個解析器會做兩件事(或者會有兩個解析器),一個是將代碼翻譯成LaTeX或MathML,另一個是評估/執行代碼。在C語言中,我會轉向Lex和Yacc(或者Flex和Bison等),並且快速的Google揭示了一個Javascript等價物:Jison。這會給你語言解析器的支柱,你可以修改它。

或者從現有的JS解析器開始可能會有所幫助,試試這個答案:JavaScript parser in JavaScript。牛逼

一旦你解析骨幹你可以把它簡單的在第一 - 翻譯成可顯示的語言應該是相當容易和評估你可以風險只是用eval - 因爲解析器將已經確保了輸入只使用你允許的內容。不過,我會建議在生產版本中(對於測試來說很好),並且將標記映射到內部函數並不需要太多額外的工作。

之後,你可能想看看改善顯示輸出,也許你想嘗試和簡化輸入或重新排序它更有意義。這需要從解析器獲取內部表示並在其上做一些巧妙的事情。但要先開始工作。

你希望這個功能可以離線工作,所以我的另一個服務器託管主機的其他示例程序的其他想法是不會工作的(並且使用Wolfram Alpha或Google是一個很好的選擇 - 但是,你說,那麼程序的重點是什麼)。但是你也可以考慮如果你用另一種基本語言寫這篇文章的時候會更好 - 儘管我猜你想要HTML/JS/CSS的可移植性。

您鏈接的其他內容是所有其他可能的想法,我只是認爲在內部使用您自己的解析器而不是依賴每個應用程序的第三方代碼可以獲得更多好處。使用您自己的解析器,您可以稍後輕鬆添加功能或語言功能。

最後想到,您不一定限制爲Javascript作爲此方法的輸入。如果你認爲你的用戶可以應付Reverse Polish Notation,那麼手工編寫解析器很容易 - 但你必須做一些很好的輸出格式化工作。

+1

MathJax是JavaScript並且可以與MathML一起工作,是的,我也會直接在JS中編寫解析。 – SpaceDog