Racket 向解释器添加sqrt
我正在尝试将sqrt函数添加到racket中的proffesor语言中,以下是语言:Racket 向解释器添加sqrt,racket,Racket,我正在尝试将sqrt函数添加到racket中的proffesor语言中,以下是语言: ;; ** The MUWAE interpreter #lang pl 03 #| BNF for the MUWAE language: <MUWAE> ::= <num> | { + <MUWAE> <MUWAE> } | { - <MUWAE> <MUWAE> }
;; ** The MUWAE interpreter
#lang pl 03
#| BNF for the MUWAE language:
<MUWAE> ::= <num>
| { + <MUWAE> <MUWAE> }
| { - <MUWAE> <MUWAE> }
| { * <MUWAE> <MUWAE> }
| { / <MUWAE> <MUWAE> }
| { sqrt <MUWAE> }
| { with { <id> <WAE> } <MUWAE> }
| <id>
|#
;; MUWAE abstract syntax trees
(define-type MUWAE
[Num Number]
[Add MUWAE MUWAE]
[Sub MUWAE MUWAE]
[Mul MUWAE MUWAE]
[Div MUWAE MUWAE]
[sqrt MUWAEE]
[Id Symbol]
[With Symbol MUWAE MUWAE])
(: parse-sexpr : Sexpr -> MUWAE)
;; to convert s-expressions into MUWAEs
(define (parse-sexpr sexpr)
(match sexpr
[(number: n) (Num n)]
[(symbol: name) (Id name)]
[(cons 'with more)
(match sexpr
[(list 'with (list (symbol: name) named) body)
(With name (parse-sexpr named) (parse-sexpr body))]
[else (error 'parse-sexpr "bad `with' syntax in ~s" sexpr)])]
[(list '+ lhs rhs) (Add (parse-sexpr lhs) (parse-sexpr rhs))]
[(list '- lhs rhs) (Sub (parse-sexpr lhs) (parse-sexpr rhs))]
[(list '* lhs rhs) (Mul (parse-sexpr lhs) (parse-sexpr rhs))]
[(list '/ lhs rhs) (Div (parse-sexpr lhs) (parse-sexpr rhs))]
[(list 'sqrt s) (sqrt (parse-sexpr s))]
[else (error 'parse-sexpr "bad syntax in ~s" sexpr)]))
(: parse : String -> MUWAE)
;; parses a string containing a MUWAE expression to a MUWAE AST
(define (parse str)
(parse-sexpr (string->sexpr str)))
#| Formal specs for `subst':
(`N' is a <num>, `E1', `E2' are <MUWAE>s, `x' is some <id>,
`y' is a *different* <id>)
N[v/x] = N
{+ E1 E2}[v/x] = {+ E1[v/x] E2[v/x]}
{- E1 E2}[v/x] = {- E1[v/x] E2[v/x]}
{* E1 E2}[v/x] = {* E1[v/x] E2[v/x]}
{/ E1 E2}[v/x] = {/ E1[v/x] E2[v/x]}
y[v/x] = y
x[v/x] = v
{with {y E1} E2}[v/x] = {with {y E1[v/x]} E2[v/x]}
{with {x E1} E2}[v/x] = {with {x E1[v/x]} E2}
|#
(: subst : MUWAE Symbol MUWAE -> MUWAE)
;; substitutes the second argument with the third argument in the
;; first argument, as per the rules of substitution; the resulting
;; expression contains no free instances of the second argument
(define (subst expr from to)
(cases expr
[(Num n) expr]
[(Add l r) (Add (subst l from to) (subst r from to))]
[(Sub l r) (Sub (subst l from to) (subst r from to))]
[(Mul l r) (Mul (subst l from to) (subst r from to))]
[(Div l r) (Div (subst l from to) (subst r from to))]
[(sqrt s) (sqrt (subst l from to))]
[(Id name) (if (eq? name from) to expr)]
[(With bound-id named-expr bound-body)
(With bound-id
(subst named-expr from to)
(if (eq? bound-id from)
bound-body
(subst bound-body from to)))]))
#| Formal specs for `eval':
eval(N) = N
eval({+ E1 E2}) = eval(E1) + eval(E2)
eval({- E1 E2}) = eval(E1) - eval(E2)
eval({* E1 E2}) = eval(E1) * eval(E2)
eval({/ E1 E2}) = eval(E1) / eval(E2)
eval(id) = error!
eval({with {x E1} E2}) = eval(E2[eval(E1)/x])
|#
(: eval : MUWAE -> Number)
;; evaluates MUWAE expressions by reducing them to numbers
(define (eval expr)
(cases expr
[(Num n) n]
[(Add l r) (+ (eval l) (eval r))]
[(Sub l r) (- (eval l) (eval r))]
[(Mul l r) (* (eval l) (eval r))]
[(Div l r) (/ (eval l) (eval r))]
[(sqrt s) (sqet (eval s))]
[(With bound-id named-expr bound-body)
(eval (subst bound-body
bound-id
(Num (eval named-expr))))]
[(Id name) (error 'eval "free identifier: ~s" name)]))
(: run : String -> Number)
;; evaluate a MUWAE program contained in a string
(define (run str)
(eval (parse str)))
;;**MUWAE口译员
#朗普03
#|MUWAE语言的BNF:
::=
| { + }
| { - }
| { * }
| { / }
|{sqrt}
|{与{}}
|
|#
;; MUWAE抽象语法树
(定义MUWAE类型)
[数字]
[添加MUWAE MUWAE]
[子MUWAE MUWAE]
[Mul MUWAE MUWAE]
[Div MUWAE MUWAE]
[sqrt MUWAEE]
[身份证号码]
[带符号MUWAE MUWAE])
(:parse sexpr:sexpr->MUWAE)
;; 将s表达式转换为MUWAE的步骤
(定义(解析sexpr sexpr)
(赛六)
[(数目:n)(数目n)]
[(符号:姓名)(身份证名称)]
[(反对者有更多)
(赛六)
[(带(列表(符号:名称)命名)正文的列表]
(名称为(parse sexpr named)(parse sexpr body))]
[其他(错误'parse sexpr'bad`with'语法在~s“sexpr”中)]]
[(列表'+lhs rhs)(添加(解析sexpr lhs)(解析sexpr rhs))]
[(列表'-lhs rhs)(子(解析sexpr lhs)(解析sexpr rhs))]
[(列表'*lhs rhs)(Mul(解析sexpr lhs)(解析sexpr rhs))]
[(列表'/lhs-rhs)(Div(解析sexpr-lhs)(解析sexpr-rhs))]
[(列表的sqrt s)(sqrt(解析sexpr s))]
[其他(错误'parse sexpr'在~s“sexpr”中语法错误)])
(:parse:String->MUWAE)
;; 将包含MUWAE表达式的字符串解析为MUWAE AST
(定义(解析str)
(解析sexpr(字符串->sexpr str)))
#|“subst”的正式规范:
('N'是a,'E1','E2'是s,'x'是some,
`y'是一个*不同*)
N[v/x]=N
{+E1 E2}[v/x]={+E1[v/x]E2[v/x]}
{-E1 E2}[v/x]={-E1[v/x]E2[v/x]}
{*E1 E2}[v/x]={*E1[v/x]E2[v/x]}
{/E1 E2}[v/x]={/E1[v/x]E2[v/x]}
y[v/x]=y
x[v/x]=v
{with{y E1}E2}[v/x]={with{y E1[v/x]}E2[v/x]}
{with{x E1}E2}[v/x]={with{x E1[v/x]}E2}
|#
(:subst:MUWAE符号MUWAE->MUWAE)
;; 将中的第二个参数替换为第三个参数
;; 根据替换规则,第一个参数;结果
;; 表达式不包含第二个参数的自由实例
(定义(子表达式从到)
(案例解释)
[(数字n)表达式]
[(添加l-r)(添加(子项l-from至)(子项r-from至))]
[(子段r)(子段(子段l从至)(子段r从至))]
[(Mul l r)(Mul(subst l from to)(subst r from to))]
[(部门r)(部门(子部门l从至)(子部门r从至))]
[(sqrt s)(sqrt(subst l from to))]
[(Id名称)(如果(eq?名称从)到expr)]
[(绑定id名为expr BONDED body)
(带绑定id)
(subst名为expr from to)
(如果(等式-绑定id从)
束缚体
(子绑定体从到)))])
#|“评估”的正式规范:
评估(N)=N
eval({+E1 E2})=eval(E1)+eval(E2)
eval({-E1 E2})=eval(E1)-eval(E2)
eval({*E1 E2})=eval(E1)*eval(E2)
eval({/E1 E2})=eval(E1)/eval(E2)
eval(id)=错误!
eval({with{x E1}E2})=eval(E2[eval(E1)/x])
|#
(:eval:MUWAE->Number)
;; 通过将MUWAE表达式减少为数字来计算它们
(定义(eval expr)
(案例解释)
[(数字n)n]
[(加上lr)(+(eval l)(eval r))]
[(分l r)((eval l)(eval r))]
[(多个r)(*(eval l)(eval r))]
[(估价册)(估价册)(估价册))]
[(sqrt s)(sqet(评估s))]
[(绑定id名为expr BONDED body)
(eval(subst-body)
绑定id
(Num(eval named expr))]
[(Id名称)(错误'eval'自由标识符:~s“名称)])
(:run:String->Number)
;; 计算字符串中包含的MUWAE程序
(定义(运行str)
(eval(parse str)))
但当我尝试运行代码时,我得到:
定义类型:变量名称已绑定在:sqrt中
我在bnf结构中添加了sqrt函数,并添加了所有eval、subst和sexper,但我想在结构中有问题
我猜sqrt是一个保存字,需要覆盖这个字,这就是这样做的方法吗?还有别的办法吗
错误是什么意思?不尝试您的程序: 问题是语言
#lang pl 03
已经有了sqrt
操作符。
因此,该名称已被使用;当您尝试给出另一个含义时,您会得到错误“variant name已绑定在:sqrt中”
我认为最简单的解决方法是调用Sqrt的平方根运算符。而不尝试您的程序: 问题是语言
#lang pl 03
已经有了sqrt
操作符。
因此,该名称已被使用;当您尝试给出另一个含义时,您会得到错误“variant name已绑定在:sqrt中”
我认为最简单的解决方法是调用Sqrt
的平方根操作符