• ベストアンサー

schemeについて

(define (test n) (if  (<= n 1) 0 (test (- n 1)))) これで(test 3)は0を返しますが、 (define (myif a b c) (if a b c)) (define (test n) (myif (<= n 1) 0 (test (- n 1)))) これで(test 3)は固まります どうしてでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.1

一般の関数は括弧の中身を全部評価して値を括弧の外に返すという評価規則に則って動作する。 しかしifは真偽によってあるものは評価しあるものは評価しない。 こういった一般の評価動作をしないものは関数でなく特殊形式と呼ばれる。 特殊形式に変換されるものは関数で書くことができないので構文定義で書く。 たとえば次のように。 (define-syntax myif (syntax-rules () ((_ a b c) (if a b c)) ) ) すると、 (define (test n) (myif (<= n 1) 0 (test (- n 1)))) (test 3) は0を返す。 (define (myif a b c) (if a b c)) だと死んだのは多分真偽に関わらずelse部分の(test (- n 1))が評価され続けたからだと思う。

関連するQ&A