2016-07-22 30 views
0

Ich versuche, ein Lambda von Parametern, so dass (apply (make-lambda '(a b) '(+ a b)) '(1 2)) kehrt 3Ist dies der richtige Weg, um ein Lambda aus zwei Listen im Schema zu erstellen?

Mein erster Versuch (define (make-lambda params func) (lambda params func)) kehrt (+ a b)

Dieser Code Werke zu schaffen, aber es mir nicht richtig anfühlen: (define (make-lambda params func) (eval (list 'lambda params func)))

Was ist die richtige Weise, dies zu tun?

+0

Ist Dies wird in der Schemaumgebung verwendet, in der es ausgeführt wird, oder ist das ein Teil eines Schema-Interpreters, den Sie schreiben? Die zwei würden unterschiedliche Antworten erfordern. – Sylwester

+0

Ich lehne Schema ab und möchte sicherstellen, dass meine Lösungen nicht hässlich sind. –

+0

Sie geben mir den Eindruck, dass Sie Prozeduren in Runtime erstellen müssen. 'eval' ist das einzige Konstrukt, das das macht. In der Regel hat die Verwendung dieses und eval große Konsequenzen für die Optimierung. Wenn Sie uns also ein Beispiel geben, wie Sie dieses verwenden, können wir insgesamt eine bessere Lösung finden. Häufig sind Lambda und Verschlüsse mit Funktionen höherer Ordnung ausreichend. – Sylwester

Antwort

2

Sie müssen die Liste auswerten, um es als eine Prozedur zu verwenden, andernfalls ist nur eine Liste von Daten, die das Symbol lambda als das erste Element haben. Diese Syntax ist etwas einfacher, aber im wesentlichen die gleiche:

(define (make-lambda params func) 
    (eval `(lambda ,params ,func))) 

Dies sollte funktionieren:

(apply (make-lambda '(a b) '(+ a b)) '(1 2)) 
=> 3 

Alternativ mit einem Makro wie leppie vorgeschlagen:

(define-syntax make-lambda 
    (syntax-rules() 
    ((_ args body) 
    (lambda args body)))) 

es verwenden wie folgt:

(apply (make-lambda (a b) (+ a b)) '(1 2)) 
=> 3 
+0

Wenn möglich, wäre eine Makro-Lösung besser. – leppie

+0

@leppie Ich bin daran interessiert, mehr als nur es zur Arbeit zu bringen. Wenn Sie eine gute Lösung haben, schreiben Sie sie bitte. –

+0

Cool, war nicht sicher, ob 'Syntax-Regeln' die Anführungszeichen entfernt haben: D – leppie

0

Weil ich langweilig bin, und wenn Ihr Programm unterstützt syntax-case :)

(define-syntax make-lambda 
    (lambda (x) 
    (syntax-case x (quote) 
     [(_ (quote pars) (quote body)) 
     #'(lambda pars body)]))) 

PS: wahrscheinlich mit syntax-rules zu (siehe Óscar López Antwort) funktioniert. Also bin ich auch faul.

Beispiel: http://eval.ironscheme.net/?id=186

Hier ist eine syntax-rules Version:

(define-syntax make-lambda 
    (syntax-rules (quote) 
    [(_ (quote pars) (quote body)) 
     (lambda pars body)])) 

Beispiel: http://eval.ironscheme.net/?id=187

Anmerkung: im Auge behalten, das ist genau das, was Sie fordern: D