Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 获取标准输入并将其存储为lisp中的字符串_String_Lisp_Common Lisp_Stdin - Fatal编程技术网

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
定义的变量,toplevel
setq
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]>