2017-07-12 40 views
0
(let ((x 21) (y 7)) 
    (princ (/ x y)) 
    (let z 
    (/ x y) 
    (if (eq z 3)(princ "Working")))) 

我對這個程序的打算是當z等於3時打印出「Working」,其中我假設z在if中可見(來自let z)in if塊;然而,情況並非如此,錯誤讀爲:變量在if塊中不可見

-IF:變量Z沒有值。

有沒有辦法讓變量z在if塊中可見?

謝謝。

+0

當某些東西不起作用時,逐個檢查每個組件,以找出問題的確切位置。就像這裏一樣,你可以檢查內部的'let'以得到'x = 21'和'y = 7'。 – Mooncrater

回答

0

您錯過了一組括號爲z的聲明。

(let ((x 21) 
     (y 7)) 
    (princ (/ x y)) 
    (let ((z (/ x y))) 
    (if (eq z 3) 
     (princ "Working")))) ;; Working 
5

您的LET語法不正確。到LET的第一個參數應該是一個變量綁定列表:

(let ((var1 val1) 
     (var2 val2) 
     ...) 
    body) 

在綁定列表,你可以擁有的只是varN代替(varN valN),這是短期的(varN nil)

但是你根本沒有一個列表,你只有符號Z,其中應該是綁定列表。這是無效的(我很驚訝你沒有得到一個語法錯誤,因爲它)。我懷疑你的意思是:

(let ((z (/ x y))) 
    (if (eq z 3) (princ "Working"))) 

順便說一句,你不應該使用eq比較數字 - 使用=

+0

如果類型不同('eql 11.0' - >'nil'),'eql'的計算結果爲'nil'。正確比較數值的方法是'='(或'equalp',它使用'='來比較數字)。 – rsm

+0

@rsm確實如此,但是這裏沒有任何東西會產生花車。我改變了我的答案,只針對有理數。 – Barmar

+0

只要'x'和'y'是整數'eql'在這種情況下起作用。但我仍然不認爲建議使用'eql'來比較一般的數值是個好主意。也'''意圖明確,'eql'不。 (哦,關於你的編輯 - 他在這裏比較整數,而不是理性:) – rsm