スキームの括弧は非常に特殊です。彼らはapply
を意味:
(define (test arg) arg)
((test +) 4 5) ; ==> 9
JavaScriptで同じ:あなたのコードで
const plus = (a, b) => a+b; // Needed since + is not a function in JS
const test = arg => arg
test(plus)(4,5) // ==> 9
はあなたが持っている:オペレータ位置復帰#<undef>
で
((display (/ (+ (* b -1) (sqrt det)) (* 2 a)))
(display (/ (- (* b -1) (sqrt det)) (* 2 a))))
残念ながら表現。実際には仕様に準じているので、何でもが仕様で定義されていないので返すことができます。 Ibのあなたの特定の実装、それは同様ですので、それは機能しませんけれども:
((test 'symbol) 4 5); ==> Error: symbol is not a function
以前test
への呼び出しを有するオペレータ位置での式はコンパイル時で約推論する完全に有効なコードとほとんど不可能である、以前のように仕事をした見たように実行時には、applyが非関数を取得したときには続行することができないことが明らかになります。
ここで、アプリケーション以外のものにかっこを使用するマクロがあります。これらのマクロは、ドキュメントを知っていたり、読んだりするだけです。それは((= 3 5) #t)
が(= 3 5)
は関数オブジェクトに評価されなくなるため、それが動作してはならない、それを見て表現し、もちろんであると仮定するのは簡単です前にcond
を見たことがない場合の例では、cond
(cond ((= 3 5) #t)
(else #f))
; ==> #f
ですブール値。しかし、cond
の各タームは、それが真の値になった場合には、そのタームの残りの部分の各要素を順番に評価します(car
)。ために、複数の式を行うと、最後の式1の値を返すために
はbegin
を使用しています:それは何もしませんので、ここで
(begin 1 2 3)
; ==> 3
が1
と2
を評価することが明らかにデッドコードです。したがって、begin
を使用することは、戻り値が重要ではない副作用を意味しますが、副作用があることを継承します。私はあなたの機能が実際に副作用を必要としているとは思わない:
(define (roots a b c)
(define det
(- (* b b) (* 4 a c)))
(cond ((> det 0)
(list (/ (+ (* b -1) (sqrt det)) (* 2 a))
(/ (- (* b -1) (sqrt det)) (* 2 a))))
((= det 0)
(list (/ (* b -1) (* 2 a))))
((< det 0)
(list (/ (+ (* b -1) (make-rectangular 0 (sqrt (* det -1)))) (* 2 a))
(/ (- (* b -1) (make-rectangular 0 (sqrt (* det -1)))) (* 2 a))))))
(roots -1 4 -4) ; ==> (2 -2)
(roots 1 0 -4) ; ==> (2)
(roots 4 0 4) ; ==> (0+1i 0-1i)
ありがとう。はい、私はifの本体にbeginを追加するつもりでしたが、今度はディスプレイがエラーを引き起こした理由がわかります。それは今働く。 –