(define a 42)
(set! 'a 10)
(define a 42)
(define (symbol) 'a)
(set! (symbol) 10)
(define a (cons 1 2))
(set! (car a) 10)
DrSchemeで実行してみましたが、機能しません。なんで?
(define a 42)
(set! 'a 10)
(define a 42)
(define (symbol) 'a)
(set! (symbol) 10)
(define a (cons 1 2))
(set! (car a) 10)
DrSchemeで実行してみましたが、機能しません。なんで?
セットを考える!最初のオペランドを評価しない define のような特別な形式です。スキームインタープリターに、その変数を記述したとおりに設定するように指示しています。あなたの例では、式 'a を単語 a に評価しません。代わりに、「'a」という名前の変数バインディングを探します (または、'a は有効なバインディングではないと思うので、インタープリターによっては、その前に壊れる可能性があります)。
式の最後のセットについて、ペアの car を設定する場合は、関数 (set-car! pair val) を使用します。この関数は、すべてのオペランドを評価するという点で、スキーム関数と同じように機能します。ペアとスキーム値の 2 つの値を取り、車がスキーム値を指すようにペアを変更します。
たとえば。
>(define pair (cons 1 2))
>pair
(1 . 2)
>(set-car! pair 3)
(3 . 2)
セットの最初の引数だから!は変数名であり、いわば「左辺値」ではありません。
最後のケースでは、(set-car!a 10)を使用します。
問題は(set! 'a 10)にあります。記号aを引用してはいけません。
あなたはSchemeを学ぼうとしていて、Lispを知らないようですよね?もしそうなら、Clojure を Lisp を学びやすいものとして試すことを強くお勧めします。Common Lisp と Scheme の両方で、リーダー、評価、シンボル、特殊フォーム、マクロなどの間の相互作用を把握できませんでした。それらはすべて複雑に相互作用しているように見えたからです。新しいものですが、Clojure のドキュメントは、Scheme や CL で見つけたどのドキュメントよりも実際に明確であることがわかりました。http://clojure.blip.tv/のビデオから始めて、clojure.org のドキュメントを読んでください。