我定义了一个名为msl的语法
#lang plai-typed
(define-type msl
[msl-num (n : number)]
[msl-add (l : msl) (r : msl)]
[msl-mul (l : msl) (r : msl)]
[msl-sub (l : msl) (r : msl)]
[msl-pow (l : msl) (r : msl)]
[msl-error (s : string)]
)
(define(** u t)
(cond
((= u 1) t)
(else
(* t(**(sub1 u) t)))))我有一个将s-expression转换为msl的解析器函数
(define (parse [s : s-expression]) : msl
(cond
[(s-exp-number? s) (msl-num (s-exp->number s))]
[(s-exp-list? s)
(let ([sl (s-exp->list s)])
(case (s-exp->symbol (first sl))
[(+) (msl-add (parse (second sl)) (parse (third sl)))]
[(*) (msl-mul (parse (second sl)) (parse (third sl)))]
[ (-) (msl-sub (parse (second sl)) (parse (third sl)))]
[ (**) (msl-pow (parse (second sl)) (parse (third sl))) ]
[else (error 'parse "invalid list input")]))]
[else (error 'parse "invalid input")]))我的问题是:如何像这样将msl表达式转换为s-expression?我是这方面的初学者
发布于 2015-02-18 06:20:58
你绝对可以做到。
不过,在我回答问题之前...你为什么要这样做?这通常不是实现赋值器所必需的。
话虽如此:它相当简单。我将从编写一些测试用例开始:
(test (unparse (msl-add (msl-num 3) (msl-num 4))) '(+ 3 4))..。以及代码本身
;; convert an msl to an s-expression:
(define (unparse parsed)
(type-case msl parsed
[msl-num (n) ...]
...))..。以此类推。如果这不合理,请告诉我。
https://stackoverflow.com/questions/28529613
复制相似问题