私はスキームの一般的なメモ処理手順を作るために宿題を割り当てられていますが、1つの引数を取るプロシージャでは動作しますが、1より大きい場合には最後の引数であると思われます。また、引数を取らない手続きをメモしても失敗します。一般的なメモのスキーム
ご協力いただければ幸いです。
(define mem
(lambda (mem-it func)
(let ((table (make-table))(func-store func))
(cond
((equal? mem-it 'memoize)
(lambda args
(if (null? args)
func
(let ((prev (lookup args table)))
(or prev
(let ((result (apply func args)))
(insert! args result table)
result))))))
((equal? mem-it 'unmemoize)
(func-store))
(else (display "No Such command"))))))
これは私がこれまでに
(define (test-proc . args)
(display "computing test-proc of ")
(display args)
(newline)
(if (null? args)
0
(+ (expt (- 42 (car args)) 2)
(apply test-proc (cdr args)))))
そして、ここでのテスト手順は
が提供されてきた私は、次の試験に
(set! test-proc (mem 'memoize test-proc))
(test-proc 40 41 42 43 44)
を実行しようとすると、エラーが発生したものです
他の手順はこちら
(define (make-table)
(list '*table*))
(define (lookup key table)
(let ((record (assoc key (cdr table))))
(and record (cdr record))))
(define (insert! key value table)
(let ((record (assoc key (cdr table))))
(if record
(set-cdr! record value)
(set-cdr! table
(cons (cons key value) (cdr table))))))
インデントがオフであるため、コードを読み取ることができません。なぜあなたのためにこれを行うエディタを使用しないでください? – Sylwester
うまくいけば今より良く見える – Cezar
あなたの問題は何ですか?あなたは複数の引数の関数をメモしようとしているのですか、または1つの引数のメモされた関数を値のリストに適用しようとしていますか? –