2010-07-07 73 views
0

嘿,我試圖在cond聲明中使用and。基本上,在運行一些代碼之前,我不需要簡單地檢查<exp1>是否爲真,我需要Scheme來檢查<exp1><exp2>是否屬實。據我所知,(and #t #f)評估爲#f(and (= 10 (* 2 5)) #t)評估爲#t。不幸的是,方案將不接受在計劃中使用「和」

(and (eqv? (length x) 1) (eqv? (car x) #t)) 

其中x是一個列表,它的第一個元素是S-表達式計算結果爲#t#f(其實,我想只是做(and (eqv? (length x) 1) (car x)),但沒有奏效)。

任何人都可以解釋我做錯了什麼,或者如何解決它?在附註中,有沒有人知道...在Scheme中的含義?謝謝!

+1

你確信(車X)顯示爲任何#T或#F? – 2010-07-07 18:04:08

+3

你想*執行*'和'或你想*使用*它?一般來說,你的問題是非常不清楚的,並且會遇到格式不正確的情況,從而隱藏了一些文本。沒有整理出來就很難說什麼。 – 2010-07-07 20:20:58

回答

3

「其中x是一個列表,其第一個元素是S表達式,其計算結果爲#t或#f(實際上,我只想做(和(eqv?(length x)1)(car x )),但沒有奏效。」

(car x)第二種情況下,你剛纔得到的第一個元素在列表中,你不評價它。

說你的列表中,x是一個列表((eq? 3 3)) ,我只是在說點什麼,它的長度是1,如果我們評估它的第一個元素評估爲#t,但在這種情況下(car x)檢索列表(eq? 3 3),這是一個符號和兩個數字的列表。

您的問題的解決方案將使用eval,如(eval (car x) (null-environment)),其中評估數據,如列表。

如果使用((car x))作爲另一個答案指出,如果你的列表中的第一個元素是一個thunk,具有null這隻會工作,如果你通過評估列表(list (lambda() #t))構建X。

在這種情況下,您的第一個元素將是一個函數,在不使用參數調用時會生成#t

0

這工作 (定義L1「(#T#F#T))

(car l1) 
; #t  
(and (car l1) (car (cdr l1))) 
; #f 

但這並不

(define l2 '((eq? 1 1) (eq? 1 2))) 

(car l1) 
; '(eq? 1 1) 
(and (car l1) (car (cdr l1))) 
; fails 

哪些是你想怎麼辦?

如果第二個,則在可能的情況下,在將其輸入列表之前考慮評估表達式。

或者你可以嘗試:

(define l3 (list eq? 1 1)) 

l3 
; '(#<procedure:eq?> 1 1) 

(apply (car l3) (cdr l3)) 
; #t