1
(define [DML vara] 
  (cond
     ((atom? (car vara)) 
      (cond
        ((eqan? (car vara) 'N)
         (display (cdr vara)))
        (else (negate vara)))

   )))

私は現在、簡単にするためにreturnの内容を保存しようとしています。これは、リストを「返す」negate関数をテストしていて、テストを行うためにその関数の結果を保存したかったのです。ネゲートからのリストリターンを実際に保存するにはどうすればよいですか。(x =(negate vara))のようなものです。ここでxはリストです。私はグーグルとスタックオーバーフローでletを調べますが、非常に単純な基本的な割り当てを見つけることができません。

私が始めたばかりのスキームで私の貧弱な構文を失礼します..そして命令型言語から関数への移行はそれほどスムーズではありません..

編集:

(negate vara)の結果式を出力したかったのですが、schemeは最後の「再帰呼び出し」のみを出力するためです(私の悪い言い回しはご容赦ください)。(negate vara)の結果のリストを使用したかったのですが、それでもそのリストを次のように出力します。

say if I had 
(else (test (negate vara)))
...
(define (test vara)
(display "test")
)

I wanted it to display 
'(O a b)) ;list
here
4

2 に答える 2

0

すでにご存知のように、let式を使用するとうまくいきます。

(let ((x 10)
      (y 20))
  (+ x y))

=> 30

上記の式は、値を 2 つの変数xおよびにバインドしますy。これらのバインディングは、 の本体内に存在しますlet。暗黙のうちに、letフォーム内のすべての式が 内にパックされ、begin式全体の最終結果が最終的な式になります。定義部分では、1 つのバインディングが他のバインディングを参照できないことに注意してください。1 つの変数が以前の定義を参照する必要がある場合は、次を使用しますlet*

(let* ((x 10)
       (y (* x 2)))
  (+ x y))

=> 30

最後に、再帰的な定義を作成する必要がある場合は、次を使用しますletrec

(letrec ((fact (lambda (x)
                 (if (zero? x) 1 (* x (fact (sub1 x)))))))
  (fact 10))

=> 3628800
于 2012-12-04T00:53:58.310 に答える
0

あなたが提案したような手順を作ることができます:

(define (test var)
  (display var)
  var)
(test (negate (test vara)))) ; prints our argument and return

または、DrRacket を使用してデバッガーを使用することもできます。一度使うと忘れちゃう!

于 2013-05-26T01:09:19.250 に答える