開始新的REPL,然後嘗試檢查您的每一個步驟的返回值:
T1> (read)
foo
FOO
T1> (read)
1
1
T1> (type-of (read))
foo
SYMBOL
T1> (type-of (read))
1
BIT
現在注意,STRING
不會在所有輸入類型的工作:
T1> (string 'foo)
"FOO"
T1> (string 1)
而且請注意,不像setq
,(format foo ...)
將不會集foo
,但寫信給它,如果它是stream或string與fill-pointer。在其Documentation看看,你會看到:
格式目的地控制串 &休息ARGS =>結果
[...]
目的地---零, t,流或具有填充指針的字符串 。
[...]
格式是產生很好 格式化文本,製作好看 的消息,等有用。格式可以 生成並返回一個字符串或輸出 到目的地。
如果目標是字符串,流, 或t,那麼結果爲零。 否則,結果是包含「輸出」的字符串 。
試試這樣說:
T1> (setq *answer*
(with-output-to-string (s)
(format s "~s" (read))))
1
"1"
T1> *answer*
"1"
或者這樣:
T1> (setq *answer* (make-array 20 :element-type 'character :fill-pointer 0))
""
T1> (format *answer* "~s" (read))
1
NIL
T1> *answer*
"1"
只有這些相關的錯誤,我能找到你的代碼。這無疑在每一個符合CL返回"works"
(你也可以使用prin1-to-string
):
T1> (defvar *answer*)
*ANSWER*
T1> (setq *answer* (format nil "~s" (read)))
1
"1"
T1> (if (stringp *answer*)
(princ "works")
(princ "failed"))
works
"works"
除非你是在一個混亂的包(評估您的代碼之前嘗試(in-package cl-user)
),或重新定義基本的功能,這將工作。給出一些更準確的錯誤描述,如果它仍然不會。
ED:
讀過比爾的答案,誰正確地指出,在read-line
作爲一個較短的解決方案,也許我應該提到的是我沒有嘗試,以顯示我的回答最好,最簡潔的,或最慣用的方法,而這些將取決於你真正想要做的事情。 (儘可能短的解決方案應該是"works"
:)它們只是幫助解釋代碼失敗原因的示例。
另一件事我忘了說的是,你應該記住,那就變量頂層setq
不是與defvar
或defparameter
一般都在什麼,但在REPL涉足避免的,因爲其後果是不確定的定義。而且,這些變量按照慣例被包裹在星號(也稱爲耳罩)中,以防止特殊詞彙與詞彙範圍變量混淆導致的錯誤。