15

私はhtmlベースの電卓に取り組んでおり、式をレンダリングしてから評価したいのですが、これはすべてJavascriptで行う必要があります。式を LaTeX で記述し、レンダリングされた式をインタラクティブに編集できるようにしたいと考えていますが、他の言語でも機能します。

私が以前に試みたのは、式をインタラクティブに MathQuill でレンダリングし、MathJS で評価することです。ただし、これはある程度機能しますが、2 つのパッケージは異なる目的で設計されているため (MathQuill は LaTeX をレンダリングしますが、MathJS はカスタムの数学構文を持っています)、完全には機能しません (たとえば、ユーザーが入力\frac{5}{17*x}して、が正しい構文である場合、それを評価し、MathJS からエラーを取得します)。

現在、次の 3 つの方法があります。

  • 私が持っているものを続けてください(または、MathJaxに切り替えるかもしれません-どちらが優れていますか?)。
  • レンダリングと評価の両方を行うツールを見つけます (ラテックスまたは他の言語であるかどうかに関係なく)。
  • 近い (同じでない場合) 構文でレンダリングおよび評価するための 2 つのツールを見つける
  • ここで推奨されているように、独自のレンダリングおよび評価ツールを作成します。これはちょっと面倒に思えるし、車輪の再発明はしたくないので、やりたくないです。

これを行うにはどうすればよいですか?

更新 1: altJSで利用可能な代替言語のリストを調べた後、ユーザー入力用の言語として Python、Ruby、または Basic を使用できると思います。もしそうしたら、それをレンダリングする可能性が非常に多く開かれます(技術的には「レンダリング」ではありませんが、そこにシンタックス ハイライターがいくつあるか考えてみてください)。ただし、ユーザーがこれらの言語のより高度な要素にアクセスできるようにしたくありません。これは、ユーザーを混乱させ、安全ではない可能性があるためです (eval)。ユーザーが数学演算、変数 (使用できると指定したもの、およびユーザーが作成したもののみ)、関数 (使用できると指定したもの、およびユーザー定義のもののみ) を使用できるようにしたいだけです。使用できる言語のサブセットを制限する方法はありますか?

更新 2: altJS ページをさらに調べたところ、ほぼすべての言語が、言語 XYZ をページ上で実行する代わりに、言語 XYZ を JavaScript にコンパイルし、ページ上で JavaScript を実行するように設計されていることがわかりまし。一つ一つ調べたわけではありませんが、ほとんどがこんな感じです。Brython のような他のものは、ブラウザーで言語 XYZ を実行するように設計されているようですが、ユーザーの入力言語としてではなく、JavaScript の代替/補完として使用されます。これらのメソッドを入力として使用できるようにするための回避策はありますか?

更新 3:その情報について @SpaceDog に感謝します。また、ユーザーが何を達成できるべきかについて具体的ではないことを指摘してくれてありがとう。だから、ここに私が達成したい機能があります:

  1. 基本演算(足し算、引き算、掛け算、割り算・分数、べき乗、根、剰余)
  2. 関数(三角関数、ログなど)
  3. 定数 (e、pi など)
  4. 変数 (割り当て、再割り当て、およびそれらの使用)
  5. ユーザー定義関数

LaTeXCalcは、最後の要件を除いて、これらの要件をすべて満たしているようです。また、Javascript にはないようです。

これは、私が考えた別のアイデアにつながります: プレゼンテーションに MathJax のようなものを使用してから、 Wolfram Alpha APIを使用して実際に計算を処理します。利点は、入力と出力の両方に、より高度なオプションがあることです。ただし、アプリケーションは役に立たなくなります (電卓が実質的に単なるクローンである場合、なぜ wolframalpha.com を使用しないのでしょうか?)、費用がかかり、アプリはオフラインで動作しません (これは HTML で記述されたデスクトップ アプリです)。 /CSS/JS)。それについての考えは?

4

1 に答える 1

8

2つの別々のことをしたいようで、方程式をうまく表示して評価します。したがって、両方を行うツールが必要です。ラテックスは評価よりも表現に重点を置いていますが、少なくともサブセットについては評価することができます (この回答を参照してください: LaTeX-syntax を持つ電卓はありますか? )。

これの多くは、電卓をどの程度複雑にするか、つまりどのような操作を許可するかによって異なります。小さなサブセットを使用している場合 (そして、そのように聞こえます)、コンバーターを手動で作成するのは非常に簡単です。プレゼンテーションとセマンティック マークアップの両方を備えたMathMLと、多くの利用可能なツールを検討します。ただし、ユーザーが把握するのが最も簡単ではない場合があります。

ユーザーがラテックスに精通しており、含まれるシンボルのサブセットが小さい場合、ラテックスを直接評価できる形式に解析するのは簡単です。

何が「最良」であるかについて誰かがより良い例を提供するために、ユーザーがアクセスできるものを正確に定義する必要があると思います。

編集 -- あなたの更新に応じて

さて、完全なプログラミング言語を作成するところまで危険なほど近づいています (必要なのは条件とループ、またはラベルだけです)。そのため、車輪の再発明は素晴らしいアイデアとは思えません。この場合、LaTeX を入力言語として使用する必要はないと思います。理想的には、ユーザーにとってより使い慣れた言語が必要です。

以下は、私が何をし、これを行う場合どこから始めるかです。これは決定的な答えではなく、努力が重複していないことを確認する前に、さらに多くの調査を行います.

私は JavaScript のサブセットを取るパーサーを構築します。このパーサーは 2 つのことを行います (または 2 つのパーサーがあります)。1 つはコードを LaTeX または MathML に変換することで、もう 1 つはコードを評価/実行することです。

これを C でオフラインで行うには、Lex と Yacc (または Flex と Bison など) を使用し、Google で Javascript に相当するJisonがあることがわかります。これにより、言語のパーサーのバックボーンが得られ、それを修正できます。

または、既存の JS パーサーから始めると役立つ場合があります。次の回答を試してください: JavaScript の JavaScript パーサー。T

解析バックボーンを取得したら、最初は単純に保つことができます。表示可能な言語への翻訳はかなり簡単で、評価のために使用するだけで危険を冒す可能eval性があります。再許可します。ただし、製品版ではこれに反対することをお勧めします (テストには問題ありません)。トークンを内部関数にマップするのに余分な作業は必要ありません。

その後、表示される出力を改善したり、入力を簡素化したり、より意味のある順序に並べ替えたりしたいと思うかもしれません。それには、パーサーから内部表現を取得し、それに対していくつかの巧妙な処理を行う必要があります。ただし、最初の手順を最初に実行してください。

あなたはこれをオフラインで動作させたいので、引用した他のサンプルプログラムのいくつかをホストするサーバーの別のアイデアは機能しません (そして、Wolfram Alpha または Google を使用することは良いオプションです - しかし、あなたが言うように、プログラムのポイント)。しかし、HTML/JS/CSS の移植性を望んでいるとは思いますが、別のベース言語でこれを書き始める方が良いかどうかも検討してください。

リンクする他のものはすべて他の考えられるアイデアです。各アプリケーションでサードパーティのコードに依存するよりも、独自のパーサーを内部に持つ方がより多くのメリットが得られると思います。独自のパーサーを使用すると、後で機能や言語機能を簡単に追加できます。

最後に、このメソッドの入力として必ずしも Javascript に制限しているわけではありません。ユーザーが逆ポーランド記法に対処できると思われる場合は、手動でパーサーを作成するのは簡単ですが、出力用に適切にフォーマットするためにいくつかの作業を行う必要があります。

于 2013-12-09T09:14:17.790 に答える