Racket 向解释器添加sqrt

Racket 向解释器添加sqrt,racket,Racket,我正在尝试将sqrt函数添加到racket中的proffesor语言中,以下是语言: ;; ** The MUWAE interpreter #lang pl 03 #| BNF for the MUWAE language: <MUWAE> ::= <num> | { + <MUWAE> <MUWAE> } | { - <MUWAE> <MUWAE> }

我正在尝试将sqrt函数添加到racket中的proffesor语言中,以下是语言:

;; ** 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
的平方根操作符