2017-02-18 3 views
0

Ich versuche, die Funktion unten zu ändern, um zwei Funktionen in Scheme zu komponieren.Funktion Zusammensetzung in Schema

(define (compose F1 F2) 
    (eval F1 (interaction-environment)) 
) 

statt

(define (compose f g) 
    (λ (x) (f (g x)))) 

Aber ich bin nicht sicher, wie eval zu verwenden.

+0

Was erwarten Sie passieren? – deltab

+0

Warum möchten Sie 'eval' verwenden? – molbdnilo

+1

'eval' macht keinen Sinn, wenn Sie zwei zwei Funktionsargumente haben. – Sylwester

Antwort

0

Von Ihrem Vorschlag, ich denke, dass Sie Scheme Makros/Preprocessing-Funktionen verwenden möchten. eval ist nicht für die Code-Umwandlung gedacht. Zusammensetzung ° können wie in Schema

(define (° f g) 
     (lambda (x) (f (g x)))) 

oder

(define-syntax ° 
    (syntax-rules() 
     ((° f g) 
     (lambda (x) (f (g x)))))) 

wo die arity von Ausdrücken f und g ist 1.

(define (plus-10 n) (+ n 10)) 
(define (minus-3 n) (- n 3)) 

(display 
    (map (° plus-10 minus-3) 
     (list 1 2 3 4))) 

Der map Ausdruck zur Compile-Zeit definiert werden, wird

(map (lambda (x) (plus-10 (minus-3 x))) 
    (list 1 2 3 4)) 

equal? s

(list 8 9 10 11)