我正在使用我认为是Common Lisp中的语法问题。我有一个全局变量*LOC*
,我可以设置它的初始值并进行更改。我的问题不在于变量,它工作正常,当我尝试显示带有其值的消息时。
例如,当我使用if语句并说出类似的内容时:
(if ( UPSTAIRSP *LOC*)
(progn (princ "I AM UPSTAIRS IN THE *LOC*"))
(progn (princ "I AM DOWNSTAIRS IN THE *LOC*"))
)
我会得到:
I AM UPSTAIRS IN THE *LOC*
我很确定这是因为我的变量在引号中,但我不知道如何表达它。
答案 0 :(得分:9)
首先,如果在progn
个分支中只有一个表达式,则不需要使用IF
。
现在,正如您所说,变量不是以字符串形式插值的。
对于实际的字符串插值,请参阅this answer,但我认为您应该首先尝试更多地了解基础知识。
你可以打印这样的东西:
(if (upstairsp *LOC*)
(progn
(princ "I AM UPSTAIRS IN THE ")
(princ *LOC*))
(progn
(princ "I AM DOWNSTAIRS IN THE ")
(princ *LOC*)))
通常,当您使用IF
发现PROGN
时,您可能需要COND
。这里没有必要这样做,因为你在两个分支中都打印*LOC*
,你可以将它排在条件之外。
(progn
(if (upstairsp *LOC*)
(princ "I AM UPSTAIRS IN THE ")
(princ "I AM DOWNSTAIRS IN THE "))
(princ *LOC*))
但您应该使用FORMAT
代替。
例如:
(if (upstairsp *LOC*)
(format t "I AM UPSTAIRS IN THE ~A" *LOC*)
(format t "I AM DOWNSTAIRS IN THE ~A" *LOC*))
实际上,FORMAT
支持条件指令。
下面,在(upstairsp *LOC*)
指令中使用~:[...~;...~]
的返回值(布尔值)来选择要打印的文本:
(format t
"I AM ~:[DOWNSTAIRS~;UPSTAIRS~] IN THE ~A"
(upstairsp *LOC*)
*LOC*)
有关更多示例,请查看A Few Format Recipes(Practical Common Lisp,Seibel)。
答案 1 :(得分:2)
在Common Lisp中,您可以使用format
operator为打印或其他目的撰写字符串和值:
(if (upstairsp *LOC*)
(format t "I AM UPSTAIRS IN THE ~a" *LOC*)
(format t "I AM DOWNSTAIRS IN THE ~a" *LOC*"))
格式的第一个参数是流(或标准输出的T
),用于在该流上打印消息,或NIL
以生成格式化字符串。您可以在manual找到所有详细信息。