2017-03-29 6 views
1

それは常にテスト結果を返します。COND句はのみ

CL-USER> (cond (t)) 
    T 
CL-USER> (cond ((> 5 10))) 
    NIL 

IF文を書くためだけの方法CONDありませんか? これはテストだけでCONDを書き換えるときのように、このために保有していない:

CL-USER> (if (> 5 1))  
    error while parsing arguments to DESTRUCTURING-BIND: 
    too few elements in 
    ((> 5 1)) 
    to satisfy lambda list 
    (SB-IMPL::TEST SB-IMPL::THEN &OPTIONAL SB-IMPL::ELSE): 
    between 2 and 3 expected, but got 1  

それがこの方法であれば、どのようCONDが正確にIFバージョンにすべての句を変換するのですか?

+1

はCONDを使用してフォームを拡張し、生成されたコードをチェックするために 'macroexpand'を使用します... –

答えて

2

CONDが、それは常にテスト結果を返し、すべての1つだけのテスト句と他には何も与えられます。

そうです。 condにHyperSpecエントリによると:

結果---試験状収率真最初句、または試験体の主値の形式の値ない形態は、その中に存在しない場合test-formがtrueを返さない場合はnilを返します。

IF文書くためだけの方法CONDはありませんか?

あなたはそれをそのように考えることができるように指揮の拡大が具体的に定義されていないが、まあ、指揮は、特別な作業であることをマクロであると宣言し、ifされます。しかしの場合は、の後にを必要とする構文で定義されますが、condはそうではありません。

CL-USER> (pprint (macroexpand '(cond ((+ 2 3))))) 

(LET ((#:G1013 (+ 2 3))) 
    (IF #:G1013 
     #:G1013 
     (COND))) 

フォームの値が値に保存され、その後、、その後、一部として使用されます。ここでは、no形式で指揮句は(SBCL中)に展開するものです。 節でフォームがある場合、それらは(その最後のフォームの値を返す)のprognに包まれている:

CL-USER> (pprint (macroexpand 
        '(cond 
        ((= 2 3) 42 78) 
        ((+ 2 3)) 
        ((= 4 5) (print 'something-else))))) 

(IF (= 2 3) 
    (PROGN 42 78) 
    (COND ((+ 2 3)) ((= 4 5) (PRINT 'SOMETHING-ELSE))))