2016-04-19 19 views
0

我已经分配了家庭作业来制定计划中的一般记忆过程,到目前为止,它对采用一个参数的过程起作用,但是对于提供超过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)))))) 
+1

由于缩进关闭,您的代码不可读。你为什么不使用编辑器来为你做这个? – Sylwester

+0

希望现在看起来更好 – Cezar

+0

你的问题到底是什么?您是否试图记忆多个参数的函数,或者您是否试图将一个参数的memoized函数应用于值列表? –

回答

1

你memoizarion程序有一个特点,它返回时没有传递参数的实现过程:

((mem 'memoize test-proc)) ; ==> test-proc 

测试过程的基本情况永远不会打,因为这个功能从而为(test-proc 1)你可以将其替换为表达(+ 1681 test-proc),由于test-proc不是一个数字,这将表示错误。

这是更好地使用神奇独特的价值观:

(define +GET-PROC+ (list "get-proc")) 
(test-proc +GET-PROC+) ; ==> original-test-proc 

因为我们正在做一个列表它是eq?只是数据。在R6RS中,您可以避免导出,以便使用记忆的代码实际上不会有混乱的情况。所有看起来像它的列表,例如("get-proc")将不会是eq?,因此它可以用作参数而不需要获取原始过程。

既然你不使用标准的哈希程序从(rnrs hashtables)SRFI-69它不可能为我检查,但由于您使用的名单,作为关键的哈希表必须使用equal?作为测试。在大多数Lisp中使用哈希表时,这通常是令人沮丧的来源。

+0

我已经添加了你询问的程序,希望它有帮助 – Cezar

+0

@Cezar'assoc'确实使用'equal?',但是它比使用我在我的答案中提到的一个哈希表实现要慢。因此,你唯一的问题是你没有使用参数作为amagic值,你试图记忆的过程也不使用参数作为基本情况。 – Sylwester