2

私はスキームに慣れていないブランドスパンキングです。クラスでパワーポイントのスライドが説明したことを除けば、今夜は初めてそれをいじりました。ユーザー入力演算子を受け取り、それに続く数値に対してその操作を実行するスキーム プログラムを作成する必要があります。(つまり、「+」、「*」などの演算子を組み込んだスキームの独自のバージョンを実装します)。問題は、再帰を使用する必要があることです。このスキームの構文を回避しようとすると、どこから始めればよいかを理解することさえ非常に困難になります。

そこで、ユーザーが入力した値を少なくとも再帰的に合計するコードから始めることにしました (ユーザーが演算子と括弧を入力したことを認識することを心配する必要はありません)。私はそれを機能させる方法を理解できません。これが私が試していることです:

(define run (lambda (x)
(cond
  ((eqv? x "a") (display x) )
  (else (+ x (run(read))))
 )))

(run (read))

x が "a" に等しいかどうかを確認する条件は、再帰を今すぐ中断する方法を意図していました。完成版では入力は括弧の中に入るのですが、ここまできたら橋を渡ろうと思いました。とにかく、コードは入力を受け入れ続け、停止することはありません。したがって、 x を表示する条件が呼び出されることはないと思います。私はおそらくすべてが間違っていることを知っています。いくつかの指針を本当に感謝しています。

編集: OK、少なくとも何かが意味をなさないことに気づき始めています。x に合計を保存していないため、 x を表示しても実際には合計が得られません。ただし、文字 a を入力してもコードが停止しない理由はまだわかりません。

編集2:私はそれを機能させましたが、条件が1に等しい場合のみ.charの入力を認識させるにはどうすればよいですか? 1?:

(define run (lambda (x)
(cond
  ((eq? x 1) 0)  
 (else (+ x (run(read))))
 )))

(run (read))
4

2 に答える 2

0
(define (addition-loop)
 (let ((answer (read)))
      (if (number? answer)
          (+ answer (addition-loop))
          0)))

これは、数値ではないものを入力するとすぐに壊れます。

さらに、ご覧のとおり、引数がゼロの関数を使用できます。

とにかく、コードの問題は、読み取りに a を入力するときです。実際には、「a」ではなく、「a」または (a を引用) と同じ値です。

(eqv? 'a "a")

;Value: #f
于 2013-05-10T12:54:10.770 に答える