私はScheme(Dr. Racketを使用しています)では、SchemeからJavascriptへの漠然とした翻訳者です。Scheme(Racket)printing #void
なぜ#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(解析「(もし(式5 3)1 0))(電流出力ポート))
期待される結果は次のとおりです。
EQ(5,3)?? 1:0
しかし、私は取得していた結果は次のとおりです。
EQ(5,3)#<無効>?? 1:0
ご迷惑をおかけして申し訳ありません。上記の関数はunparse-> jsです。 これで修正されました。 –
(parse '(if(eq?5 3)1 0)) – soegaard
'(if-exp(app-exp(var-exp eq?)(num-exp 5) ))))(num-exp 1)(num-exp 0)) 基本的に、これらの「式」は「パーサ」と呼ばれる別のモジュールを使用して翻訳されます。 –