2016-05-16 67 views
1

我有我認爲是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

默認情況下,Common Lisp不會執行字符串插值。可以編寫字符串插值庫,然後使用這些庫。 – Vatine

回答

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找到所有的細節。

9

首先,如果在IF分支之一中只有一個表達式,則不需要使用progn。 現在,正如你所說的,變量不是用字符串插值的。 對於實際的字符串插值,請參見this answer,但我認爲您應該先嚐試學習一些基本知識。

您可以打印的東西,像這樣:

(if (upstairsp *LOC*) 
    (progn 
    (princ "I AM UPSTAIRS IN THE ") 
    (princ *LOC*)) 
    (progn 
    (princ "I AM DOWNSTAIRS IN THE ") 
    (princ *LOC*))) 

一般來說,當你發現IFPROGN,有機會,你需要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(實用的Common Lisp,塞貝爾)。