2014-11-13 21 views

回答

5

在流程的只有假值#f(雖然有時false別名也用相同的值來定義),什麼都被認爲是真實的 - 其中包括:0""'(),等於是明確在此表達式:

(if 0 'a 'b) 

0是truthy,因此整個表達式的計算結果爲'a作爲一個結果。

0

不同的語言對於非布爾值是否可以視爲布爾值以及哪些值計爲True vs False做出了不同的決定。有關某些語言的行爲的比較,請參閱here

方案是使決策語言:

  • 你可以在需要布爾
  • 任何值比典型虛假符號#f是truthy其他環境中使用非布爾值。
0

大多數LISPers有關於空列表一樣的感覺。年初以來的LISP nil/()也是唯一的錯誤值。計劃推出#f爲假,並保持()幾個報告爲假,直到他們刪除()爲假值。因此只有#f被認爲是錯誤的。

你不能輕易改變的報告,所以我建議你做一個程序做你想要什麼:

(define (boolean x) 
    (not (or (eq? x '()) 
      (eq? x #f) 
      (eqv? x "") 
      (eqv? x 0)))) 

(boolean "")   ; ==> #f 
(if (boolean 0) 'a 'b) ; ==> b 

另外,如果你使用這個有很多,你可以讓自己的宏:

(define-syntax mif 
    (syntax-rules() 
    ((_ predicate consequent alternative) 
    (if (boolean predicate) consequent alternative)))) 

(mif 0 'a 'b) ; ==> b 

隨着R6RS和R7RS您可以在一個庫中做到這一點,作爲if(except (rnrs) if)一起重新命名了這一點,那麼你可以導入,而不是(rnrs)這一點,得到這個if行爲,而不是標準。請注意,您不能更改使用rnrs或其他庫的內容,因此您需要製作所有特殊表單的版本,這些表單的行爲與所需行爲有所不同。閱讀你的代碼的人可能會感到困惑。

相關問題