問題タブ [gambit]
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.
pointers - Gambit-C スキームの FFI で動作するポインタへのポインタを取得できません
グラフィック エンジン API を Gambit-C でラップする過程にあり、これまで FFI で成功しています。今日、簡単には乗り越えられない新たな問題に遭遇しました。
私はCでこのような構造を持っています:
C には、共通のリスト動作を追加するためにマクロによって定義される一連の関数もあります。次に、次のようになります。
C では、NULL の render_list_item* を持つことができますが、それをこの関数の最初のパラメーターに渡すことができ、基本的にリストの先頭を作成します。
私の問題は、Gambit-C の FFI でこの動作を動作させることができないことです。私はこのようなものを作成することになります:
これを実行すると、セグメンテーション違反が発生します。調査の結果、render -list-add-itemプロシージャの___arg1がNULLです。何を試しても、FFI で有効な (ポインター (ポインター)) を取得できません。
これに欠けているものはありますか?
================================================== ==========
完全なスキームの例:
コンパイル:
出力を与えます:
================================================== ==========
編集:
Felix: render-list-add-item を呼び出す方法の例をいくつか教えてください
このための C コードは次のようになります。
sglibに基づくリスト実装です。上記のように、これらが null ポインターを指すポインターを渡すと、リストの先頭として新しいリスト項目が作成され、*ui_render_list がそれを指すようになります。
スキーム コードは次のようになります (メモリから入力)。
希望は、同様の動作をすることでした。ドキュメントを見ると、C API に #f があると NULL に変換されるように見えますが、(ポインター (ポインター)) がそれをキャッチする可能性があると思いました。何かにバインドされている変数を渡すことでさえ、常に NULL 値につながりました。ポインターのアドレスを単純に出力する (c-declare) 関数を作成して、これをテストしました。
私の完全なラッパーの動作を見たい場合は、こちらのコミットをご覧ください。
==========================================
(ポインター (ポインター)) をどのように機能させるかという問題はまだ残っています。しかし、より迅速な結果と他の言語との相互運用性を向上させるために、C リスト マクロを書き直してリスト構造を定義し、「C でアルゴリズムをマスターする」で見られるように、リストの先頭/末尾へのポインターを含めるつもりだと思います。 . そうすれば、ポインタへのポインタは必要ありません。
scheme - スキームの n arity zip 関数 (apply と map の問題)
リストのリストでマップを呼び出すのに問題があります。
これは私たちが望んでいるものですが、これを呼び出し可能な関数から機能させることはできません。
編集 --(map (lambda x x) '(1 2) '(3 4) '(5 6))
同じ結果が得られます!
zip に渡された引数がリストになるという問題はわかりますが、動作バージョンで行ったようにそれらを扱い続けることはわかりません。
apply
がマップでどのように使用されているかわかりません
map は何も呼び出していないため、これは理にかなっています。;; しかし、fold 関数の map 呼び出しと同じ引数に map を適用するにはどうすればよいでしょうか?
これは最初の試みとまったく同じです。ここで小さな何かが欠けていると確信しています (...希望)。
scheme - Gambit-C スキームの define-macro 名前空間
4 つのモジュール:
- ライブラリ関数を定義します
- ライブラリ関数を使用するライブラリ マクロを定義します。
- ライブラリ マクロを使用するアプリケーション関数を定義します
- 他の 3 つをロードします。
libfunc.scm:
libmacro.scm:
libapp.scm
libmain.scm
これが機能する別のスキームから、機能しない Gambit-C への移植。無理だと思い始めています。Gambit-C has##define-macro
および##namespace
which は関連する可能性がありますが、どこにも文書化されておらず、Google で検索できません。多くのスキーム間で移植可能な大きなライブラリである Meroon で私が見つけたものの 1 つは、Gambit-C を回避するためのこのコードです。
編集: Meroon の作者である Christian Queinnec は、この問題をうまく処理していたと思います。彼は、Scheme のモジュールについて私が知っている 23 のことを書きました。フランス語とスキームの両方を話せば、すべての答えが得られるような気がします。
編集 2 : 移植しようとしているシステムを実行するために構築された元のスキームを調べました。彼らはだますことがわかりました。から呼び出されるすべての「関数」にはdefine-macro
、マクロ グローバル名前空間に関連付けられた C のシャドウ実装があります。Gambit-C は非常に C 指向であるため、Gambit-C でコピーできるトリックかもしれませんが、その可能性はまだ調査中です。
define
構文ケースを使用してマクロから通常の d 関数を呼び出すことができるかどうかはわかりません。私はそれについて理解しやすいものを見つけることができません (ほとんどのドキュメンテーションは Phds によって、そして Phds のために書かれているようです) が、マクロとして任意の関数を実装できることを示す非常に興味深いチュートリアルがdefine-syntax
あります。syntax-case
マクロで基本的な Lisp を実装することさえできます。それは何かです。単なるエキセントリックのための JRM の構文規則入門
編集 3 : @GoZonerのように、少なくとも Racket ではfor-syntax
andを使用してこれを行うことができます。define-syntax
Gambit-C で動作するかどうかはまだわかりません
(require (for-syntax ...
魔法が起こる場所です。ラケットにはそれがあります。Gambit-C はそうではありません。
racket - R5RS スキームでの定義構文のポータブル ロード/インクルード?
DrRacket/plt-r5rs と Gambit/gsi の両方で動作するものを書こうとしています。
私が抱えている問題は(load "foo.scm")
、Gambit でブロックが読み込まれないことdefine-syntax
です。Gambit で使用(include "foo.scm")
すると機能しますが、DrRacket ではもちろん構文エラーが発生します。
移植可能な R5RS コードを記述できるように、これを解決する方法はありますか?
私が試したこと:
- への再定義
(include "foo.scm")
、(load "foo.scm")
およびその逆。問題: Gambit でマクロを再定義するのは違法です。 - 上記の再定義を
(if gambit ...)
. 問題: if (別の define 内でない限り) 内に define を置くことは違法です。 - 代わりに、ファイル名を含む文字列をライブラリ ファイルのインクルードに渡します。問題: Gambit のインクルードは、解釈が開始される前に発生するようです。
scheme - Gambit scheme incorrect calculation for numbers with decimals
i'm using gambit-c intepreter to evaluate scheme arithmetic operations, but it's results are bit off. for example i execute (+ 23 20.01) and it gives me 43.010000000000005, instead of 43.01.
This only occurs if i use numbers with 2 decimal points.
Is there a fix for this?
functional-programming - スキーム関数の作成
スコアリング関数 (既に作成済み) と文字列のペアのリスト (書き方について混乱している) の両方を入力として取り、変更された文字列のペアのリストを返す関数を作成するにはどうすればよいですか?返されるリストには、入力関数に従ってスコア付けされた、入力からのすべての最適な文字列ペアが含まれている必要があります。
入力例:
出力例:
この関数は、上記のように文字列のペアのリストを受け取ります。関数も取り入れています。文字列のペアのリストを評価する手段として取り込んだこの関数を使用します。次に、文字列のペアを評価するために指定された関数に基づいて、一致スコアが最も高かったすべての文字列のペアを含む文字列のペアのリストを返します。つまり、(("hello" "b_low") ("hello_" "b_l_ow") ("hello" "_blow")) はすべて -3 という同じスコアでしたが、("h_e_llo" "bl_o__w")) はスコアが -12 であるため、リストから削除されます。
alignemt を計算する関数:
lambda - R5RSスキームで「λ」文字を「ラムダ」として使用するマクロはありますか?
R5RSスキームで「λ」文字を「ラムダ」として使用するマクロはありますか? ここからGambit「scheme-r5rs」で試しました:
しかし、Ill-formed expression
エラーが発生し続けます。
scheme - Gambit Scheme Interpreter からファイルへのパイプ テスト/トレース
私が手続きする場合、例:
たとえば、(square 5) を使用してテストします。この結果を Gambit Scheme インタプリタからテキスト ファイルにパイプするにはどうすればよいですか?
c - Gambit-C スキーム: Windows dll を読み込めません
Gambit-C スキームを使用して Windows 共有ライブラリを動的にロードする際に問題があります。
ディレクトリ構造:
GSC コマンド:
純粋にコンパイルされた C でテストしたところ、そこにロードされます。ありがとうございました。