2017-04-11 3 views
1

Ich arbeite durch den kleinen Schemer und ich versuche, alle Antworten in Common Lisp zu konvertieren. In Kapitel 8 werden anonyme Funktionen besprochen und anonyme Funktionen zurückgegeben. Zum Beispiel:Wiederkehrende mit anonymen Funktionen Common Lisp vs. Schema

(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)))))))) 

Mein Code:

(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)))))) 

Das Problem ist die letzte Zeile des zweiten Blocks des Codes. Ich bekomme den Fehler "zu viele Argumente für Nachteile", aber ich kann kein zusätzliches Klammerpaar hinzufügen, wie es der Schema-Code tut. Ist diese Art der Rekursion in Common Lisp nicht möglich?

Antwort

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 gibt eine Funktion und in Ihrem Schema Version Sie es anwenden, während in der CL, anstatt die Liste abgeflacht, wenn es mit funcall Anwendung jedoch es wie die Funktion scheint, die zurückgegeben werden soll, auf die man gleich ist es holt so können Sie es zwischenspeichern, indem sie es lokal mit labels definieren:

(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)) 

Das gleiche Schema mit lokalen define (das ist wirklich eine letrec mit flacher Syntax):

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