2017-04-30 11 views
0

私は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

答えて

1

文字列出力ポートに印刷し、問題が解決するかどうかを確認してください。 完全なサンプルを作成しない場合は、テストできます。バグは、例えば、unparse-> jsまたは別の関数にある可能性があります。ボイドが印刷されている数字に

、unparse-> JSが呼び出されるたびに

(lambda (ast output-port) 

は、このような現在のAST印刷その後

(displayln ast) 

右を挿入します。それでは、犯人であるcondの条項を見つけることができます。

コメントについてもっと「ボイド」がポップアップします。

最初に出力ポートがrepl出力ポートと同じであるという問題が2つあります。つまり、印刷しない値(num-exp節など)はreplによって印刷されます。

この

(と-出力 - 文字列 (ラムダ()(unparse-> JS(解析「(IF(EQ?5 3)1 0))(電流出力ポートを試してみてください) ))))

これは、すべてが印刷された文字列を作成します。 unparse-jsから戻って以来

(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))) 

あなたが関数fprintfを使用するすべての句でvoidは(その関数fprintfはvoidを返す覚えている)の1つがあなたがvoidを印刷します:

第二の問題は、印刷のこの方法が原因でありますサブ式はvoidを返します。

問題はここで問題を回避する方法です。一般的な解決策は、印刷を2つに分割することです。第1段階は、文字列のツリーを構築することです。文字列に文字列を出力すると、正しい出力が得られます。

ので、代わりの:

(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))) 

ます。これは、文字列のツリーを返しunparse->js行います

(list (unparse->js (if-exp->test ast)) 
     " ? " 
     (unparse->js (if-exp->then ast)) 
     " : " 
     (unparse->js (if-exp->else ast)))) 

を書きます。

次に、ツリーを繰り返して、個々の文字列を印刷するプリンタ機能を作成します。

+0

ご迷惑をおかけして申し訳ありません。上記の関数はunparse-> jsです。 これで修正されました。 –

+0

(parse '(if(eq?5 3)1 0)) – soegaard

+0

'(if-exp(app-exp(var-exp eq?)(num-exp 5) ))))(num-exp 1)(num-exp 0)) 基本的に、これらの「式」は「パーサ」と呼ばれる別のモジュールを使用して翻訳されます。 –