String 获取标准输入并将其存储为lisp中的字符串
我意识到这可能是一个非常愚蠢的问题,但我不知道为什么这不起作用,我几乎放弃了。基本上我试过:String 获取标准输入并将其存储为lisp中的字符串,string,lisp,common-lisp,stdin,String,Lisp,Common Lisp,Stdin,我意识到这可能是一个非常愚蠢的问题,但我不知道为什么这不起作用,我几乎放弃了。基本上我试过: (setq answer (string (read))) 及 及 当我尝试评估 (if (stringp answer) (princ "works") (princ "failed")) 在上述任何一次尝试中,结果总是失败 我做错了什么?开始一个新的REPL,然后尝试检查每个步骤的返回值: T1> (read) foo FOO T1> (read) 1 1 T1&g
(setq answer (string (read)))
及
及
当我尝试评估
(if (stringp answer)
(princ "works")
(princ "failed"))
在上述任何一次尝试中,结果总是失败
我做错了什么?开始一个新的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
不同,(格式foo…
不会设置foo
,但如果它是a或带有a的,则会对其进行写入。看看它,您将看到:
格式化目标控制字符串
&rest args=>result
[……]
目的地——零、t、流或a
带有填充指针的字符串
[……]
格式有助于产生良好的效果
格式化文本,产生好看的效果
消息等等。格式可以
生成并返回字符串或输出
去目的地
如果目标是字符串、流,
或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"
或者像这样:
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来字符串
):
除非您在一个混乱的包中(在评估代码之前尝试(在包cl用户中)
),或者重新定义了基本功能,否则这将起作用。如果仍然不能,请给出一些更准确的错误描述
教育署:
在阅读了Bill的答案后,他正确地指出了read line
是一个较短的解决方案,我也许应该提到,我没有试图在我的答案中展示最好、最简洁或最惯用的方法,这些方法将根据您真正想做的事情而有所不同。(最短的解决方案应该是“works”
:)它们只是一些示例,可以帮助解释代码失败的原因
我忘了说的另一件事是,您应该记住,对于未使用defvar
或defparameter
定义的变量,toplevelsetq
s通常在任何情况下都要避免,但不要涉足REPL,因为后果是未定义的。此外,按照惯例,这些变量用星号(也称为耳罩)包装,以防止将特殊项与词汇范围的变量混淆而导致的错误。或者您可以:
(setq answer (read-line))
这就给了你一条线
[1]> (setq answer (read))
3
3
[2]> (type-of answer)
(INTEGER 0 16777215)
[3]> (setq answer (read-line))
3
"3"
[4]> (type-of answer)
(SIMPLE-BASE-STRING 1)
[5]>
[1]> (setq answer (read))
3
3
[2]> (type-of answer)
(INTEGER 0 16777215)
[3]> (setq answer (read-line))
3
"3"
[4]> (type-of answer)
(SIMPLE-BASE-STRING 1)
[5]>