显示消息中全局变量的值

1 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*"))
)
Run Code Online (Sandbox Code Playgroud)

我会得到:

I AM UPSTAIRS IN THE *LOC*

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

cor*_*ump 9

首先,progn如果在其中一个IF分支中只有一个表达式,则不需要使用.现在,正如您所说,变量不是以字符串形式插值的.对于实际的字符串插值,请参阅此答案,但我认为您应该首先尝试更多地了解基础知识.

你可以打印这样的东西:

(if (upstairsp *LOC*)
  (progn 
    (princ "I AM UPSTAIRS IN THE ")
    (princ *LOC*))
  (progn 
    (princ "I AM DOWNSTAIRS IN THE ")
    (princ *LOC*)))
Run Code Online (Sandbox Code Playgroud)

一般来说,当你发现IFPROGN,很有可能你需要COND.这里没有必要,因为你*LOC*在两个分支中打印,你可以在条件之外进行分析.

(progn
  (if (upstairsp *LOC*)
    (princ "I AM UPSTAIRS IN THE ")
    (princ "I AM DOWNSTAIRS IN THE "))
  (princ *LOC*))
Run Code Online (Sandbox Code Playgroud)

但你可能应该使用FORMAT.例如:

(if (upstairsp *LOC*)
  (format t "I AM UPSTAIRS IN THE ~A" *LOC*)
  (format t "I AM DOWNSTAIRS IN THE ~A" *LOC*))
Run Code Online (Sandbox Code Playgroud)

实际上,FORMAT支持条件指令.下面,指令中(upstairsp *LOC*)使用布尔值的返回值~:[...~;...~]来选择要打印的文本:

(format t 
        "I AM ~:[DOWNSTAIRS~;UPSTAIRS~] IN THE ~A"
        (upstairsp *LOC*)
        *LOC*)
Run Code Online (Sandbox Code Playgroud)

有关更多示例,请查看A Few Format Recipes(Practical Common Lisp,Seibel).