【发布时间】:2017-09-28 04:43:46
【问题描述】:
我在 Scheme 中有以下功能(使用 Dr. Racket),它是从 Scheme 到 Javascript 的模糊翻译。
我似乎无法弄清楚为什么要打印#void。
我猜它与 fprintf 的返回值有关,但我不确定如何克服这种行为。
有什么想法吗?
(define unparse->js
(lambda (ast output-port)
(cond ((def-exp? ast) (fprintf output-port "const ~a = ~a;" (unparse->js
(def-exp->var ast) output-port) (unparse->js (def-exp->val ast) output-port)))
((cexp? ast)
(cond ((num-exp? ast) (number->string (num-exp->val ast)))
((bool-exp? ast) (if (eq? (bool-exp->val ast) #t) "true" "false"))
((str-exp? ast) (str-exp->val ast))
((var-exp? ast) (symbol->string (var-exp->var ast)))
((literal-exp? ast) (list 'quote (literal-exp->val ast)))
((proc-exp? ast) (fprintf output-port "(~a) => { ~a }"
(string-join
(map (lambda (b)
(unparse->js b output-port)
)
(proc-exp->params ast)
)
",")
(string-join
(map (lambda (ast)
(unparse->js ast output-port)
)
(proc-exp->body ast))
";")))
((if-exp? ast) (fprintf output-port "~a ? ~a : ~a"
(unparse->js (if-exp->test ast) output-port)
(unparse->js (if-exp->then ast) output-port)
(unparse->js (if-exp->else ast) output-port)))
((let-exp? ast) (fprintf output-port "let ~a; ~a;"
(string-join
(map (lambda (b)
(fprintf output-port "~a = ~a"
(unparse->js (binding->var b) output-port)
(unparse->js (binding->val b) output-port)
)
)
(let-exp->bindings ast)
)
",")
(string-join
(map (lambda (b)
(unparse->js b output-port)
)
(let-exp->body ast))
";")
)
)
((app-exp? ast) (fprintf output-port "~a(~a)"
(unparse->js (app-exp->rator ast) output-port)
(string-join
(map (
lambda (rand)
(unparse->js rand output-port)
)
(app-exp->rands ast)
)
",")
)
)
(else (error "Unknown exp type: " ast))))
(else (error "Unknown exp type: " ast)))
)
)
我这样称呼它:
(unparse->js (parse '(if (eq? 5 3) 1 0)) (current-output-port))
预期结果是:
eq?(5,3) ? 1 : 0
但是,我得到的结果是:
eq?(5,3) # ? 1 : 0
【问题讨论】: