Lisp初心者です.取り敢えずhigh and low でも作ってみようかと考えまして,次のコードを書きました.
CommonLisp
1(defvar *nowNum*) 2(defvar *count*) 3(defvar *nextNum*) 4(setq *nowNum* (random 100)) 5(setq *count* 0) 6 (loop 7 (format t "nowNum = ~D~%High(1) or low(0):") 8 (setq *flug* read-line) 9 (setq *nextNum* (random 100)) 10 (if (= *nowNum* *nextNum*) 11 (format t "They are equal~%") 12 (if (equal (> *nextNum* *nowNum*) (= *flug* '0') ) 13 (progn(format t "Failed~% next is ~D~%You won ~D times." *nextNum* *count*) loop-finish) 14 (progn 15 (setq *nowNum* *nextNum*) 16 (setq *count* (+ *count* 1)) 17 ) 18 ) 19 ) 20 )
このとき,次のエラーが出ました.
terminal
1Unhandled SB-C::INPUT-ERROR-IN-LOAD in thread #<SB-THREAD:THREAD "main thread" RUNNING 2 {1001878103}>: 3 READ error during LOAD: 4 5 unmatched close parenthesis 6 7 Line: 12, Column: 52, File-Position: 332 8 9 Stream: #<SB-SYS:FD-STREAM for "file /home/smearble/programming/CommonLisp/test/test.lisp" {10009E8E03}> 10 11Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {1001878103}> 120: (SB-DEBUG::DEBUGGER-DISABLED-HOOK #<SB-C::INPUT-ERROR-IN-LOAD {10009ED1E3}> #<unused argument> :QUIT T) 131: (SB-DEBUG::RUN-HOOK *INVOKE-DEBUGGER-HOOK* #<SB-C::INPUT-ERROR-IN-LOAD {10009ED1E3}>) 142: (INVOKE-DEBUGGER #<SB-C::INPUT-ERROR-IN-LOAD {10009ED1E3}>) 153: (ERROR #<SB-C::INPUT-ERROR-IN-LOAD {10009ED1E3}>) 164: (SB-C:COMPILER-ERROR SB-C::INPUT-ERROR-IN-LOAD :CONDITION #<SB-INT:SIMPLE-READER-ERROR "unmatched close parenthesis" {10009ED1A3}> :STREAM #<SB-SYS:FD-STREAM for "file /home/smearble/programming/CommonLisp/test/test.lisp" {10009E8E03}>) 175: (SB-C::%DO-FORMS-FROM-INFO #<FUNCTION (LAMBDA (SB-KERNEL:FORM &KEY :CURRENT-INDEX &ALLOW-OTHER-KEYS) :IN SB-INT:LOAD-AS-SOURCE) {10009EAF9B}> #<SB-C::SOURCE-INFO {10009EAF63}> SB-C::INPUT-ERROR-IN-LOAD) 186: (SB-INT:LOAD-AS-SOURCE #<SB-SYS:FD-STREAM for "file /home/smearble/programming/CommonLisp/test/test.lisp" {10009E8E03}> :VERBOSE NIL :PRINT NIL :CONTEXT "loading") 197: ((FLET SB-FASL::THUNK :IN LOAD)) 208: (SB-FASL::CALL-WITH-LOAD-BINDINGS #<FUNCTION (FLET SB-FASL::THUNK :IN LOAD) {7FFBF7D3774B}> #<SB-SYS:FD-STREAM for "file /home/smearble/programming/CommonLisp/test/test.lisp" {10009E8E03}>) 219: ((FLET SB-FASL::LOAD-STREAM :IN LOAD) #<SB-SYS:FD-STREAM for "file /home/smearble/programming/CommonLisp/test/test.lisp" {10009E8E03}> NIL) 2210: (LOAD #<SB-SYS:FD-STREAM for "file /home/smearble/programming/CommonLisp/test/test.lisp" {10009E8E03}> :VERBOSE NIL :PRINT NIL :IF-DOES-NOT-EXIST T :EXTERNAL-FORMAT :DEFAULT) 2311: ((FLET SB-IMPL::LOAD-SCRIPT :IN SB-IMPL::PROCESS-SCRIPT) #<SB-SYS:FD-STREAM for "file /home/smearble/programming/CommonLisp/test/test.lisp" {10009E8E03}>) 2412: ((FLET SB-UNIX::BODY :IN SB-IMPL::PROCESS-SCRIPT)) 2513: ((FLET "WITHOUT-INTERRUPTS-BODY-11" :IN SB-IMPL::PROCESS-SCRIPT)) 2614: (SB-IMPL::PROCESS-SCRIPT "test.lisp") 2715: (SB-IMPL::TOPLEVEL-INIT) 2816: ((FLET SB-UNIX::BODY :IN SB-IMPL::START-LISP)) 2917: ((FLET "WITHOUT-INTERRUPTS-BODY-1" :IN SB-IMPL::START-LISP)) 3018: (SB-IMPL::START-LISP) 31 32unhandled condition in --disable-debugger mode, quitting
エラーを見るに12行目のif式のいずれかの括弧が問題なのだと思われますが,しかしながら何度確認しても括弧は思ったとおりに対応しているように見えます.このエラーが発生している原因を教えてください.
実行環境
debian 11.2
SBCL 2.1.1.debian
実行時コマンド $sbcl --script test.lisp
とりあえずエラーの原因は '0' ですね。Lisp ではシングルクオート ' は文字や文字列ではなく (QUOTE ...) の別名で、'0' のように 2 つの ' 囲むのではなく、'x や '(a b c) のように 1 つだけで使います。
http://lisphack.blog137.fc2.com/blog-entry-3.html
あと、loop の使い方もあやしいような…。(自分もよく知りませんが。)
http://www.nct9.ne.jp/m_hiroi/clisp/abcl27.html
シングルクォートをダブルクォートに変更してみて下さい。
(if (equal (> *nextNum* *nowNum*) (= *flug* '0') )
=>
(if (equal (> *nextNum* *nowNum*) (= *flug* "0") )
ただ、この変更をしてもその他のエラーが発生します。
あっ...最近Pythonとかやってたので文字列のつもりで'書いてました...
loopの方は当該サイトだとhttp://www.nct9.ne.jp/m_hiroi/clisp/abcl05.htmlの方に書かれてる方の単純な無限ループを用いているつもりです.一旦解決しましたが異なるエラーが出てしまったため自己解決をちょっと試みてみますので一旦このままにします.
format t "nowNum = ~D~%High(1) or low(0):" *nowNum*)では?
そちらは自己解決しました.
回答1件
あなたの回答
tips
プレビュー