2017-04-11 13 views
1

私はLittle Schemerを使っています。すべての回答をCommon Lispに変換しようとしています。 第8章では、匿名関数を返すだけでなく、匿名関数についても説明します。例えば :匿名関数を使用した反復Common Lisp vs. Scheme

(define insertL-f 
    (lambda (test?) 
     (lambda (new old l) 
      (cond 
       ((null? l) (quote())) 
       ((test? (car l) old) (cons new l))) 
       (else (cons (car l) ((insertL-f test?) new old (cdr l)))))))) 

マイコード:

(defun insertL-f (test) 
    (lambda (new old l) 
     (cond 
      ((null l) '()) 
      ((funcall test (car l) old) (cons new l)) 
      (t (cons (car l) (insertL-f test) new old (cdr l)))))) 

問題は、コードの第2のブロックの最後の行です。私は "consのために引数が多すぎます"というエラーを受け取りますが、Schemeコードのように余分な括弧を追加することはできません。 Common Lispではこのスタイルの再帰はできませんか?

答えて

2
(defun insertL-f (test) 
    (lambda (new old l) 
    (cond 
    ((null l) '()) 
    ((funcall test (car l) old) (cons new l)) 
    (t (cons (car l) 
       (funcall (insertL-f test) 
         new 
         old 
         (cdr l))))))) 
2

insertL-f返される関数は、それがフェッチ1に等しくなるようにそれはそうしかしfuncallでそれを適用する場合はCLで代わりにリストを平坦化されている間、機能を返し、あなたのスキームのバージョンでは、あなたはそれを適用あなたはlabelsでローカルに定義することによって、それをキャッシュすることができます

:スキームで同じ

(defun insert-l-f (test) 
    (labels ((func (new old l) 
      (cond 
       ((null l) '()) 
       ((funcall test (car l) old) (cons new l)) 
       (t (cons (car l) (func new old (cdr l))))))) 
    #'func)) 

を使用して(実際には平らな構文とletrecである)defineローカル

関連する問題