5

私はSchemeに慣れ親しんでいますが、おそらく私の側の根本的な誤解を反映している問題にぶつかりました。

たとえば、Scheme で次のことを行うとします (この場合は Guile を使用しますが、Chicken でも同じです)。

> (define x 5)
> x
5
> (string->symbol "x")
x
> (+ 5 (string->symbol "x"))
<unnamed port>:45:0: In procedure #<procedure 1b84960 at <current input>:45:0 ()>:
<unnamed port>:45:0: In procedure +: Wrong type: x
> (symbol? (string->symbol "x"))
#t
> (+ 5 x) ; here x is dereferenced to its value 5
10
> (+ 5 'x) ; here x is not dereferenced
<unnamed port>:47:0: In procedure #<procedure 1c7ba60 at <current input>:47:0 ()>:
<unnamed port>:47:0: In procedure +: Wrong type: x    

が効果的に引用されてstring->symbolいるシンボル を返していることを理解しています。ただし、後でコンテキストでx返されたシンボルを使用する方法がわかりません。string->symbolどうすればSchemeにそのシンボルを評価させることができますか?

なぜこれをやりたいのかという背景を説明すると、Guile を組み込んだ C プログラムを書いているからです。scm_from_*_symbolまたは などを使用して、C から名前で Guile で定義されたシンボルにアクセスできるようにしたいと考えていますscm_string_to_symbol。これらの関数が思ったように機能しない理由は、上記の私の中心的な質問に関連しています。私が Guile でやりたいことを行うためのより良い方法があるかもしれませんが、それは別の問題です。今、私は上記の基本的な質問に興味があります。

4

3 に答える 3

3

必要なのは、シンボルを評価することです(「逆参照」しないでください)。これはあなたが意味したことだと思います:

(define x 5)
(+ 5 (eval 'x (interaction-environment)))
=> 10

詳細については、ドキュメントを参照してください。

于 2013-06-01T13:19:18.510 に答える
2

この意味では、シンボルは特別なものではありません。つまり、通常の文字列よりも評価が容易ではありません。

シンボルは文字列によく似ており、引用符で囲まれていません。もちろん、基本的な違いは、引用符がないことではなく、シンボルがインターンされていることです。これは、文字列"x""x"が 2 つの異なる文字列 (ただし、それらは等しい) であることを意味しますが、シンボル'x'xは実際には同じオブジェクトです。

于 2013-06-01T13:10:00.437 に答える
2

Guile ドキュメントのfly-evaluationの章を読む必要があります。

あなたが望むevalとおそらくinteraction-environment

有名なSICPと Queinnec's Lisp In Small Piecesを読むことをお勧めします

于 2013-06-01T13:10:34.003 に答える