2012-03-27 1 views
1
#lang eopl 

(define-datatype env env? 
    (empty-env) 
    (extended-env (var symbol?) 
       (val scheme-val?) 
       (envi env?))) 

(define (scheme-val? x) #t) 

; examples 
(define e-env (empty-env)) 
(define e1 (extended-env 'x 1 (extended-env 'y #f e-env))) 

Ich verstehe nicht, wie scheme-val? verwendet wird. Warum gibt es eine x, und warum geben wir #t zurück? Umgebung ist eine Funktion, die eine Variable mit einem Wert verknüpft.Was macht dieses Schema?

Also im Beispiel verknüpfen wir x = 1 und y = #f, richtig?

Danke.

Antwort

1

Im Schema ist #t bedeutet Boolean wahr, #f ist falsch. Ich verstehe den Rest nicht ganz, aber ich schlage Drugsets Debugger vor, um zu sehen, was vor sich geht.

(define e-env (empty-env)) 

ordnet e-env ein empty-env

(define (scheme-val? x) #t) 

definiert eine anonyme Funktion zu sein, die einen Parameter x nimmt, und wenn es eine scheme-val ist (in diesem Fall etwas), kehrt #t.

Das Ergebnis e1 nach diesem Code ausgeführt ist:

#(struct:extended-env x 1 #(struct:extended-env y #f #(struct:empty-env))) 

so e1 eine ist extended-env with var='x, val=1, envi=(extended-env with var='y, val=#f, envi=e-env)

(glaube ich)

+0

Vielen Dank. Das Prädikat 'scheme-val' nimmt' x' an, aber in 'env' wird es in dieser Form' var scheme-val? 'Geschrieben, also rate ich, wenn wir' define-datatype' treffen, das Schema zu werfen Variable links vom Prädikat als Parameter des Prädikats. Ist das korrekt? – CppLearner

+0

Verwechseln Sie 'define-datatype' nicht mit' define'. In der 'env' Definition, speziell der' envanced-env' Definition, ist 'val' ein' scheme-val'. Diese 'scheme-val?' -Operation wird durch die '(define (scheme-val? X) #t)' -Funktion definiert, die für jeden Parameter 'x' wahr zurückgibt. Das ist nur die Syntax. – prelic

+0

Danke. Aber wo ist der Parameter x, wenn wir 'val scheme-val?' Schreiben? Ist "val" in "scheme-val" übergegangen?Mit anderen Worten, Schema-Interpreter ist schlau, um zu bemerken, dass, da dies "Datentyp" ist, also die Variable auf der linken Seite als Parameter übergeben wird? Ich hoffe, das klärt meine Frage auf. Vielen Dank. – CppLearner

3

scheme-val? eine Funktion, die #t (true) angenommen hat, zurückkehren wenn der übergebene Wert von diesem Typ ist (in diesem Fall ein "scheme-val"). Genau wie symbol? gibt true für Symbole zurück und false für alles andere, scheme-val? gibt true für jedes Objekt zurück, das ein Schema-val ist.

Es stellt sich heraus, dass in diesem Fall scheme-val? für alles wahr zurückgibt - also ist alles ein Schema-val. Die x ist da, weil das Prädikat benötigt wird, um ein einzelnes Argument zu nehmen, es ignoriert einfach das Argument und gibt #t für alles zurück.

Es ist in diesem Fall wichtig, weil Sie die define-datatype auffallen werden, nimmt es einen Wert, und ein Prädikat seine Art zu überprüfen (env der Wert ist, env? ist das Prädikat).

Anscheinend extended-env nimmt auch ähnliche Klauseln. In diesem Fall sind drei von ihnen: var, das ist eine symbol?, val, die eine scheme-val? und env ist, die eine env? ist.

+0

Sehr nett :) danke. Der Teil "ist für alles wahr" ist wirklich hilfreich. Vielen Dank! – CppLearner