3

私は計画に不慣れです。これはMITのSICPコースからのコードサンプルです。

 (define (+ x y)
  (if (= x 0)
      y
      (+ (-1+ x) (1+ y))))

これをラケットコードに変換するにはどうすればよいですか?コードの実行にDrRacketを使用しているので、Racketに変換したいと思います。これまでは機能していましたが、スキームのインクリメント演算子について不満がありました。

私が得るエラーは次のとおりです。

  1. define-values: cannot change constant variable: +
  2. reference to undefined identifier: -1+
4

2 に答える 2

12

これはRacketで正常に機能します。

(define (add x y)
  (if (= x 0)
      y
      (add (sub1 x) (add1 y))))

いくつかのコメント:

  • プロシージャの名前+は、Schemeのプリミティブな追加操作と衝突するため、面倒です。次のように別の名前を使用すると、より簡単にaddなります(これにより、最初のエラーが修正されます)
  • -1+はRacketの手順ではないので、次のように置き換えますsub1(これにより、2番目のエラーが修正されます)。オプションで、次のように、このプロシージャのエイリアスを定義できます。(define -1+ sub1)
  • 1+ラケットの手順ではありません。に置き換えてadd1ください。オプションで、次のように、このプロシージャのエイリアスを定義できます。(define 1+ add1)
  • オプション:代わりに(= x 0)書くことができます(zero? x)
于 2012-06-15T18:58:29.993 に答える
2

2番目のエラーを修正するには、とに変更(-1+ x)します。この答えは、最初のエラーに役立つはずです。(- x 1)(1+ y)(+ y 1)

-1+とを使用したい場合は1+、自分で定義できます。

(define (1+ x) (+ x 1))
(define (-1+ x) (- x 1))
于 2012-06-15T18:55:44.973 に答える