Scheme 方案跟踪变量检查
我需要函数来检查变量是否有阴影?函数应该返回#t或#f,这取决于是否有变量阴影。 我使用DrRacket实现代码()。到目前为止,我有这个Scheme 方案跟踪变量检查,scheme,racket,plai,Scheme,Racket,Plai,我需要函数来检查变量是否有阴影?函数应该返回#t或#f,这取决于是否有变量阴影。 我使用DrRacket实现代码()。到目前为止,我有这个 #lang plai (define-type WAE [num (n number?)] [add (lhs WAE?)(rhs WAE?)] [sub (lhs WAE?)(rhs WAE?)] [with (name symbol?)(named-expr WAE?)(body WAE?)] [id (name symbol?)]
#lang plai
(define-type WAE
[num (n number?)]
[add (lhs WAE?)(rhs WAE?)]
[sub (lhs WAE?)(rhs WAE?)]
[with (name symbol?)(named-expr WAE?)(body WAE?)]
[id (name symbol?)])
(define (parse sexpr)
(cond
[(number? sexpr) (num sexpr)]
[(symbol? sexpr) (id sexpr)]
[(list? sexpr)
(case (first sexpr)
[(add) (add (parse (second sexpr)) (parse (third sexpr)))]
[(sub) (sub (parse (second sexpr)) (parse (third sexpr)))]
[(with) (with (first (second sexpr))
(parse (second (second sexpr)))
(parse(third sexpr)) )]]
[else (error "unexpected token")]))
(define (symbol<? a b)
(string<? (symbol->string a) (symbol->string b)))
我不知道#lang plai
,但我相信代码的第二部分可能有语法错误
(define (shadowed? wae)
(let
>>> Possible error >>> ([l(type-case WAE wae
[num (n) n]
[add (lft rght) (+ (shadowed-variable? lft) (shadowed-variable? rght))]
[sub (lft rght) (- (shadowed-variable? lft) (shadowed-variable? rght))]
[with (x i b) (shadowed-variable? (sub b x (shadowed-variable? i)))]
[id (s) (error 'shadowed-variable? "free variable")])])
>>>> Error >>> (if (remove-duplicates (flatten l) symbol=?) #t #f)))
试试这个,让我们知道
(define (shadowed? wae)
(let
([l (type-case WAE wae
[num (n) n]
[add (lft rght) (+ (shadowed-variable? lft) (shadowed-variable? rght))]
[sub (lft rght) (- (shadowed-variable? lft) (shadowed-variable? rght))]
[with (x i b) (shadowed-variable? (sub b x (shadowed-variable? i)))]
[id (s) (error 'shadowed-variable? "free variable")])])
(if (remove-duplicates (flatten l)) symbol=?) #t #f))
你能不能比“它不起作用”更具体一点?发生了什么不应该发生,或不应该发生但应该发生的事情?是的,可能是错误,但它仍然不能正常工作。例如,(带阴影的?(id'x))应该返回#t,(带阴影的?(num 1))应该返回#f。我到了这里error@vladang为什么
(隐藏的?(id'x))
应该是#t
?您的id
案例中是否有error'阴影变量?“自由变量”)
。另外,请尝试REPL中的(删除重复项(展平1)symbol=?)
,看看会发生什么。
(define (shadowed? wae)
(let
([l (type-case WAE wae
[num (n) n]
[add (lft rght) (+ (shadowed-variable? lft) (shadowed-variable? rght))]
[sub (lft rght) (- (shadowed-variable? lft) (shadowed-variable? rght))]
[with (x i b) (shadowed-variable? (sub b x (shadowed-variable? i)))]
[id (s) (error 'shadowed-variable? "free variable")])])
(if (remove-duplicates (flatten l)) symbol=?) #t #f))