問題タブ [chicken-scheme]
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.
scheme - Chicken Schemeに変数が存在するかどうかを判断する方法は?
変数が現在定義されているかどうかを実行時に確認する方法がチキン スキームにありますか?
編集: XY 問題。
コードを生成するマクロを書いています。この生成されたコードは相互再帰でマクロを呼び出す必要があります。マクロが単にそれ自体を呼び出すだけでは機能しません。マクロが再帰的に呼び出されるとき、最初に呼び出されたときとは異なる動作をする必要があります。ネストされた関数を使用しますが、ええと....それはマクロです。
大まかな例:
(はい、スキームが defmacro を使用していないことは知っていますが、私は Common Lisp から来ています。また、すべてが地獄に行かなければ、ここに逆引用符を入れることはできないようです。)
マクロの INITIAL 呼び出しで、再帰的に呼び出された場合にのみ意味を持つ余分な引数を取りたくありません。他の手段で知ってもらいたい。
生成されたコードで、最初のマクロ内にネストされていて呼び出しサイトに存在しないマクロを呼び出すことはできますか? たとえば、?(,other-macro)
の代わりに呼び出すコードを生成します。(macro)
しかし、マクロは関数のようなファーストクラスのオブジェクトではないため、それは機能しないはずです...
macros - Chicken Schemeマクロで「when」マクロを呼び出す方法は?
Chicken Scheme は、(when)
と同等のマクロを定義し(if (begin))
ます。ただし、自分のマクロの 1 つからこれを呼び出そうとすると、「変数」が定義されていないと不平を言います。
エラー: (blah ...) の展開中 - バインドされていない変数: when
これを機能させるにはどうすればよいimport
ですか?
macros - Chicken Scheme のマクロ エキスパンダー プロシージャから、既存のマクロ (例: let-values) を使用する方法は?
let-values
組み込みの Chicken Scheme マクロ (特にこの例では) を自分のマクロから呼び出すにはどうすればよいですか?
バインドされていない変数: let 値
scheme - 拡張機能を使用する Chicken Scheme プログラムを静的にリンクする方法は?
Chicken プログラムをコンパイルして静的にリンクする必要があります。私は多くの拡張機能を使用することを期待していますが、特にhttp-client
.
次のコマンドでソースをコンパイルできます。
また
しかし、実行すると、次のエラーが表示されます。
(declare (uses http-client))
ソースでも試しましたが、成功しませんでした:
静的リンクは必要なものです。これは XY 問題ではありません。依存関係のない新しくインストールされた Linux システムで実行可能ファイルを実行する必要があります。これが、私が最初に Common Lisp から Scheme に切り替えた主な理由です。
私は何を間違っていますか?
scheme - #><# シャープ記号読み取り構文を含む Chicken Scheme ファイルをロードする方法は?
repl で、または次を使用してロードされたファイルで、ほとんどのシャープ記号読み取りマクロ(load)
を使用できます。
しかし、私は外部宣言構文を使用できません#> <#
:
確かに、おそらく repl で使用する理由はありませんが、(load)
実行時に他のソースを調べて内省するプログラムを作成しようとしていますが、次の構文にヒットすると失敗します。
シャープな構文(load)
を含むファイルはどうすればよいですか?#>
compilation - 複数の Chicken Scheme ファイルをコンパイルするには?
複数のソース ファイルを含む Chicken Scheme プロジェクトをコンパイルする必要がありますが、エラーが発生します。
マニュアルとこの SO answerによると、ソースに sを入れる必要があり(declare)
ます。他のソースをインポートしていることをコンパイラが認識できない理由はわかりませんが、まあ。
問題は、s を入れても、コンパイラがs とs(declare)
について文句を言うことです。(import)
(use)
infinity.filesystem.scm:
infinity.general.scm:
指示:
コンパイラは次のように述べています。
構文エラー (インポート): 未定義のモジュールからインポートできません
と
非バインド変数: 使用
「infinity.general」のimport
and宣言を削除するだけで、ファイルはコンパイルされます。use
ただし、これには2つの問題があります。
- and句がない場合、結果の
.o
ファイルは実際に機能しますか? それとも、実行時に欠落しているコードについて文句を言うでしょうか?import
use
csi
私のコードには宣言が含ま(import)
れている必要がありますが、含まれていない必要があります。ただし、コードがと!の両方で機能する必要があります。(use)
csc
csi
csc
どうすればこれを解決できますか?
compilation - このチキン スキーム コードをコンパイルするにはどうすればよいですか?
どうやら私の前の質問は広すぎました。ここでもう一度質問を簡略化し、ソース コードの例を示します。
複数のファイルを含む Chicken Scheme プロジェクトをコンパイルしようとしています。
テスト a.scm:
テスト b.scm:
公式マニュアルによると、次のようにする必要があります。
私が実際に得るのはこれです:
構文エラー (インポート): 未定義のモジュールからインポートできません
注意事項:
- マクロを呼び出しています。
- 節が
(declare (uses
ありますが、csc はソースを見つけられません。 csc test-a.scm test-b.o -o test
どちらも機能しません。- を削除する
load
と、プログラムは csi で動作しなくなります。 - を削除する
use
と、プログラムは csi で動作しなくなります。 - csi で動作するプログラムが必要です。
csiとの互換性を損なうことなく、これをコンパイルするにはどうすればよいですか?
lambda - スキームのlet-over-lambda?
Common Lisp では、2 つの関数で状態を共有したい場合、次のようにlet over ラムダを実行します。
これらの関数は に対してローカルではありません。let
共有状態変数への参照を維持するグローバル関数であり、それ自体は外部からは見えません。たとえば、コードの別の場所で次のことを行うことができます。
しかし、Scheme では、そのような構造は、外部からは見えないローカル関数を宣言します。
この種の機能を実現するために私が考えることができる唯一の方法 (モジュール内でエクスポートされていないグローバルを使用することを除く) は、次のようになります。
そのような醜い回避策に頼ることなく、 let-over-lambdaフォームを書く方法は Scheme にありますか? それとも、この醜さをラップするマクロを書く必要がありますか? (ところで、私は について知っていletrec
ますが、それはこの問題の解決策ではありません。)
ちなみに、私はチキンスキームを使用していますが、私の質問はすべてのスキームに関連するはずです。