2017-02-18 6 views
0

Я пытаюсь изменить приведенную ниже функцию, чтобы составить две функции на Схеме.Функциональная композиция в схеме

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

, а не

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

Но я не уверен, о том, как использовать Eval.

+0

Что вы ожидаете произойдет? – deltab

+0

Почему вы хотите использовать 'eval'? – molbdnilo

+1

'eval' не имеет никакого смысла, если у вас есть два аргумента функции. – Sylwester

ответ

0

Из вашего предложения, я думаю, вы хотите использовать возможности макросов/препроцессий Scheme. eval не предназначен для преобразования кода. Состав ° может быть определен в схеме, как

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

или

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

, где арность выражений f и g является 1.

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

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

Выражение map во время компиляции становится

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

equal? s

(list 8 9 10 11) 
Смежные вопросы