2016-04-11 4 views
1

関連する質問を調べてみましたが、Common LISPで変数をどのように定義するべきかについて簡単な答えが見つかりませんでした。私はSBCLの実装を使用して、私は私が言語を学ぶのを助けるためにチュートリアルを使用してきたが、いくつかの理由のために、このコード:svclでsetqを使用することはできません[LISP]

;;print a line many times 
(setq xx 1) 
(while (< xx 20) 
    (message "yay") 
    (setq xx (1+ xx)) 
) 

はエラーを返します:変数XXは結合していないです。 whileとmessageのスタイル警告も受け取ります。誰かが、このコードの問題点について私に正しい方向に向けることができますか?

+2

Common Lisp。 XXは定義されていません。あなたはそれを定義していません。あなたはそれを定義したいかもしれません。 WHILEは存在しません。 LOOPを参照してください。 MESSAGEも存在しません。 Common Lispのようには見えません。言語リファレンスを最初に確認する必要があります。彼らはAPROPOSやDOCUMENTATIONのようなビルトインツールもあります。 –

+2

** "私は言語を学ぶのに役立つチュートリアルを使用していますが、何らかの理由でこのコードを**" **あなたはそのチュートリアルへのリンクを提供できますか? ** while **はCommon Lispのループマクロではありませんが(簡単に定義することはできますが)、チュートリアルはすばらしいものではなく、一般的なlispではありません。完全に再現されていません。 –

+1

ウェブチュートリアルで[this](http://www.gigamonkeys.com/book/)をお勧めします。 – molbdnilo

答えて

0

さて、このチュートリアルでは、Common Lispのようではありません、この機能を実行するために、lispのより多くのemacsを思わだから、これはこのコードがないことを多くの理由の一つであるEmacsとielmコマンド

*** Welcome to IELM *** Type (describe-mode) for help. 
ELISP> ;print a line many times 
(setq xx 1) 
(while (< xx 20) 
    (message "yay") 
    (setq xx (1+ xx)) 
) 
*** IELM error *** More than one sexp in input 
ELISP> (setq xx 1) 
1 (#o1, #x1, ?\C-a) 
ELISP> (while (< xx 20) 
    (message "yay") 
    (setq xx (1+ xx))) 
nil 
ELISP> (message "yay") 
"yay" 
ELISP> (while (> xx 20) 
    (message "yay") 
    (setq xx (1+ xx))) 
nil 
ELISP> xx 
20 (#o24, #x14, ?\C-t) 
ELISP> 

を使用あなたがSBCL REPLでそれを実行すると、多くのエラーが未知の関数、バインドされていない変数、プロンプトが表示されます...

コメントを表示するには、良いlispのチュートリアルや本を取る、私はポールグレアムあなたが楽しいのが好きならConrad barkiからのLispの土地はあなたの本です、そしてlispのあなたのコードは次のようになります:

CL-USER> (dotimes (xx 20 xx) (print "yay")) 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
"yay" 
20 

はあなたがdefparameter対変数、setqと、特別な変数...ループ、私は数年前にlispの学習を開始する事の多くを定義する方法を学ぶ必要がある、私はそれは素晴らしい旅

1

だと思います質問のタイトルやアンバウンドのコンパイラの苦情がここに来たのであれば、あなたが興味を持っている答えは、アンケンジの答えの最下部に埋もれている可能性があります:defvarまたはdefparameterまたはletを使用してください。前の2つは、通常、トップレベルのフォームとして使用されます。対照的に、letは、限られた範囲内で「一時的な」名前付き変数を確立するために使用されます。

;; define *xx* so that it can be "seen" globally 
(defparameter *xx* 23) 
;; establish a variable which is only "seen" locally 
(let ((xx 0)) 
    (format t "xx: ~S~%" xx) 
    (incf xx) 
    (format t "xx: ~S~%" xx)) 

Difference between `set`, `setq`, and `setf` in Common Lisp?が役に立つ場合もあります。

関連する問題