在消息

时间:2016-05-16 10:45:26

标签: lisp common-lisp

我正在使用我认为是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*

我很确定这是因为我的变量在引号中,但我不知道如何表达它。

2 个答案:

答案 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找到所有详细信息。