問題タブ [camlp4]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ocaml - OCaml の「改訂された構文」とは?
人々が OCaml で「改訂された構文」に言及するとき、これは言語の新しい構文になるという意味ですか、それとも CamlP4 で作成された代替構文にすぎないのでしょうか? 前者の場合、「改訂された構文」はいつ OCaml の「正式な構文」になるのでしょうか?
ocaml - OCamlプログラムのASTを取得することは可能ですか?
特定のOCamlプログラムのASTを取得できるようにしたい(たとえば、ASTをウォークして、インストルメント化されたバージョンのコードを生成したり、何らかの変換を実行したりしたい)。OCamlツールのいずれかがこの機能をサポートしていますか?
preprocessor - OCaml の注釈
タイトルはやや誤解を招く可能性があるので、私が達成しようとしていることを説明させてください.
私は、動作が異なる複数の型で機能する多数の演算子を持つプログラミング言語を書いています。実装は進化しており、オペレーターは試行中に私がより便利だと思うものに変更/適応しています。
問題は、言語のドキュメント、実装、および言語のインライン ヘルプ (一種の REPL があります) の間で一貫性を維持する方法です。
ほとんどの動作は大きなパターン マッチ ブロック内で定義されているため、前処理の実行で txt ファイル (または同様の csv、html など) を抽出できるように、何らかの方法で (おそらく Camlp4 を使用して) コードに注釈を付けることができるかどうか疑問に思っていました。すべての演算子が実装されています。
つまり、次のようなものがある場合
次のようなものが欲しい
コメント内の情報 (何かを使用するためだけにコメント構文を使用しました。実際に OCaml プリプロセッサを使用したことがないため、どのように機能するかはまだわかりません) は、プロジェクトをコンパイルするときに抽出され、どこかに保存されます。
おそらく、求めていることは不可能であり、ソースを ocaml プリプロセッサ/コンパイラ自体とは異なるもので個別に処理する必要があります。
手がかりはありますか?
編集:私がやりたいことを示すために具体的な例を挙げます...
たとえば、 plus 命令は、私の言語で書かれたプログラムを次のようにコンパイルします。
このパターンマッチのすべての句に次のような注釈を付けたいと思います
ソースコードを前処理し、実装されたすべての操作の種類と説明を注釈から取得したリストのようなものを作成できるようにします。コードを変更する必要はありません。利用可能なすべての指示を別々の方法で追跡する必要なく、一貫性を維持するためだけです (ドキュメントとインライン ヘルプのためにそれらをインデックス化する必要があるため)。
外部の処理ツールを使わずにやりたいので、コンパイル段階でコメントなどを処理できるものがないか聞いてみました。
前もって感謝します
sharepoint - SoapServerExceptionをスローするCAMLクエリ
これは例外です:
CAMLコードは次のとおりです。
フィルタを指定しない場合、コードは機能します...
compiler-construction - OCaml:関数識別子からのみ関数を返す
私は、いくつかの作り上げられた言語で書かれたスクリプトを解析し、そのスクリプトを使用していくつかの計算を行うプログラムを書いています。この言語には、タイプの外部OCaml関数を呼び出すために使用される特定の構造があり'a -> bool
ます。だから、言語の真ん中で私たちは持っているかもしれません
パーサーに次のようなコンストラクターを使用してもらいたい
そのビットを値として解析します
ここで、「foo」は、ユーザーが別の.mlファイルで提供する必要があり、パーサーが事前に知らない関数です。「foo」が定義されているOCamlファイルの名前のみが実行時にパーサーに渡されます。したがって、string->型の関数を定義する必要があります('a->bool)
。これは、ある関数の名前を取り、その関数を返します。
私の質問は次のとおりです。
(1)コードの動的ロードではDynLink.loadfileを使用する必要があると想定しています。これは行く方法ですか?
(2)識別子の知識から関数「foo」にアクセスするにはどうすればよいですか?(これは私をcamlp5に導きますか?)
ocaml - ocamloptの-pp文字列でcamlp4とcamlp5を組み合わせますか?
BOLT、SEXP、ocamlVizを組み合わせて大規模なプロジェクトを作りたいです。問題は、SEXPとBOLTがCamlP4を使用しており、ocamlvizがcamlp5を使用していることです。しかし、ocamlc / ocamloptの-pp引数の1つのチェーンへの呼び出しをどのように組み合わせることができますか?
これがocamlvizなしの実際のプロジェクトの私の呼び出しです:ocamlopt.opt -c -I + dynlink -I + bolt -I + threads -I + lablgtk2 -I + extlib -I + pcre -I + netsys -I + netstring -I + json-wheel -I + num -I + nums -I + sexplib -I + zip -I + xml-light -I + xmlrpc-light -I + equeue -I + netclient -g -annot -p -thread -pp ' camlp4o /usr/lib/ocaml/bolt/bolt_pp.cmo -logger'\''foo.native' \'' -level DEBUG-- -I / usr / lib / ocaml / sexplib -I / usr / lib / ocaml / type-conv pa_type_conv.cmo pa_sexp_conv.cmo'-o foo.cmx foo.ml
ocaml - camlp4 : 利用可能なクォーテーション エキスパンダーがありません
ファイルには次のtest.ml
1 行のみが含まれます。
次に、次のコマンド ラインを使用してそのファイルに camlp4 を適用します。
出力は次のとおりです。
ファイルが前処理され、引用が適切に展開されることを期待していました。ここで私は何を忘れていますか?
syntax - 構文拡張付きの OCaml トップレベル
一般的にこれを達成する方法はわかりませんが、明確にするために、特に1つのインスタンスについて質問します。
Sexplib は私には興味深いようです。私はそれで遊んでみたい。私はそれをダウンロードし、問題なくインストールしました(とにかく、かなり確信しています)など。トップレベルで「with sexp」構文拡張を使用したいです。どうすればこれを行うことができますか?私が見つけたその使用例はすべて、トップレベルを作成する方法や構文拡張を使用してコンパイルする方法を既に知っていることを前提としています。
私のベストショットは次のようなものでした:
このトップレベルを実行すると問題なく実行できますが、構文拡張open Sexplib
を使用しようとすると構文エラーが発生します。with sexp
ocaml - camlp5(OCaml)でバックティック引用符が使用されているため、用語名にバックティックを使用できません
私はYojsonライブラリを使用しており、使用されるコンストラクターの1つは `Bool(バックティック付き)と呼ばれます。私は、バックティックで囲まれたテキストが異なる方法で解釈されるようにcamlp5が使用されているOCamlソースを使用しています(たとえば、テキストはOCamlデータ構造に変換されます)。
私が抱えている問題は、 `Boolが私のソースコードに表示されると、camlp5 / OCamlがバックティックを見て、それが引用の始まりであると考えて、エラーを引き起こしていることです。これが代わりに`BoolOCaml用語として解釈されることをどのように確認できますか?campl5の機能を一時的にオフにする方法はありますか?私が使用できるある種のエスケープ文字?
ocaml - 最後のletバインディングに文字列としてアクセスできるcamlp4構文拡張を作成することは可能ですか?
私はこのようなコードを持っています:
後で変数を作成したい場合は、次のことを行う必要があります。
'full'を2回繰り返す必要はなく、名前を文字列として取得するための内省的な方法を考え出したいと思います。camlp4がこれに役立つと思いますが、どこから始めればよいのかわかりません。
したがって、最終的には、次のようなことができるようになりたいと思います。
ここで、:letname:は、現在のletバインディングを(この場合は「full」)の代わりに文字列として入力します。(構文:letname:は単なる提案であり、OCamlの構文と衝突しない構文の他のアイデアですか?)
このようなより簡潔な構文がおそらく望ましいでしょう:
その後、次のように拡張されます。
これはcamlp4で行うことができますか?もしそうなら、どうすればよいですか?
(さらに検討すると、:letname:構文などは、より汎用的で、より多くの領域で役立ちます)