2016-09-29 1 views
2

Donc je suis assez inexpérimenté avec Racket mais j'écris un interprète.Raquette - faire la fermeture et appliquer la fermeture

J'ai été incapable de trouver un aperçu de ce qu'est exactement une fermeture, ou comment "appliquer-fermeture" ou "faire-fermeture" serait défini/expliqué.

J'écris juste valeur d'interprète avec correspondance, etc.

Toute aide serait grandement appréciée.

exemple de la classe Compte tenu -

(define value-of 
(lambda (exp env) 
    (match exp 
    [`,b #:when (boolean? b) b] 
    [`,n #:when (number? n) n] 
    [`(zero? ,n) (zero? (value-of n env))] 
    [`(sub1 ,n) (sub1 (value-of n env))] 
    [`(* ,n1 ,n2) (* (value-of n1 env) (value-of n2 env))] 
    [`(if ,test ,conseq ,alt) (if (value-of test env) 
           (value-of conseq env) 
           (value-of alt env))] 
    [`(begin2 ,e1 ,e2) (begin (value-of e1 env) (value-of e2 env))] 
    [`(random ,n) (random (value-of n env))] 
    [`,y #:when (symbol? y) (apply-env env y)] 
    [`(lambda (,x) ,body) (make-closure x body env)] 
    [`(,rator ,rand) (apply-closure (value-of rator env) 
            (value-of rand env))]))) 
+0

Veuillez lire la Structure et l'interprétation des programmes informatiques, le chapitre 4 traite des interprètes et il vous expliquera tout ce que vous devez savoir. –

Répondre

2

Considérons cet exemple:

(define x 42) 
(define f (lambda (y) (+ y x)) 
(f 1) 

La question est: quelles informations doivent être disponibles lorsque (f 1) est évalué? D'une certaine manière, la valeur si x doit être stockée pour une utilisation ultérieure. Une solution consiste à stocker une copie de tout l'environnement dans la fermeture.

(struct closure (args env expression)) 
(define f (make-closure '(y) the-environment '(+ y x)) 

Une meilleure solution consiste à analyser l'expression et à ne stocker que des variables libres dans la fermeture. Voir SICP ou EoPL pour plus de détails.