私は完全な Lisp 初心者なので、優しくしてください。
[un-]宣言されていない自由変数というCLの考えに頭を悩ませています。私は次のように考えます:
(defun test ()
(setq foo 17)
)
変数 foo を宣言し、それを 17 に設定する関数を定義します。ただし、代わりに
;Compiler warnings :
; In TEST: Undeclared free variable FOO
私の実際の例はもう少し大きくなります。私のコード(スニペット)は次のようになります:
(defun p8 ()
;;; [some other stuff, snip]
(loop for x from 0 to (- (length str) str-len) do
(setq last (+ x str-len)) ; get the last char of substring
(setq subs (subseq str x last)) ; get the substring
(setq prod (prod-string subs)) ; get the product of that substring
(if (> prod max) ; if it's bigger than current max, save it
(setq max prod)
(setq max-str subs)
)
)
;;; [More stuff, snip]
)
そしてそれは私に与えます:
;Compiler warnings for "/path/to/Lisp/projectEuler/p6-10.lisp":
; In P8: Undeclared free variable LAST (2 references)
;Compiler warnings for "/Volumes/TwoBig/AllYourBits-Olie/WasOnDownBelowTheOcean/zIncoming/Lisp/projectEuler/p6-10.lisp" :
; In P8: Undeclared free variable PROD (3 references)
;Compiler warnings for "/Volumes/TwoBig/AllYourBits-Olie/WasOnDownBelowTheOcean/zIncoming/Lisp/projectEuler/p6-10.lisp" :
; In P8: Undeclared free variable SUBS (3 references)
;Compiler warnings for "/Volumes/TwoBig/AllYourBits-Olie/WasOnDownBelowTheOcean/zIncoming/Lisp/projectEuler/p6-10.lisp" :
; In P8: Undeclared free variable =
はい、はい、私はあまりにも多くの中間変数を使用していることに気付きましたが、CL の世界で人気があるように、すべてを最小限の型付き文字に圧縮することに夢中になる前に、何が起こっているのかを理解しようとしています。
それで、とにかく...誰かが次のことを説明できますか:
- Lispはどのような条件で変数を「宣言」しますか?
(...)
上記の変数のスコープは、setq
ステートメントの囲み以外ですか?!(... (setq ...) ...)
(つまり、変数が有効であり、 の外側の括弧 1 レベルからすべてのスコープが設定されていることを期待しますsetq
。いいえ?- Undeclared free variableメッセージを誤解していますか?
- あなたが提供したい他のヒントは、ここで何が起こっているのかをよりよく理解するのに役立ちます.
注: 私は、C、Java、Javascript、Obj-C、および関連する手続き型言語の専門家です。関数型プログラミングは違うと思います。今のところ、私は構文に取り組んでいます。
ありがとう!
PSそれが問題であればdefun p8
、テキストファイル(TextMate)にあり、私はそれを実行していClozure CL
ます。うまくいけば、それは問題ではありません!