Clojurescript使用nodejs读取stdin

时间:2017-11-10 07:44:42

标签: javascript node.js clojurescript

我无法使用ClojureScript从NodeJs读取stdin。理想情况下,最终命令为java -cp cljs.jar:src clojure.main node.clj,后跟node main.js。 Javascript版本工作正常但我无法使用ClojureScript工作。

Clojurescript

(ns hello-world.core
  (:require [clojure.string :as string] [cljs.nodejs :as nodejs]))

(nodejs/enable-util-print!)

(defn -main [& args]
  (let [readline (js/require "readline")
    rl (.createInterface readline js/process.stdin js/process.stdout)]
    (.on rl "line" 
     (fn [line]
          (def lineVector (clojure.string/split line #" "))
          (if  (and (nil? lineVector)
                    (< (get lineVector 0) 10) 
                    (< (get lineVector 1) 10))
            (+ (get lineVector 0) (get lineVector 0)))))))

(set! *main-cli-fn* -main)

的Javascript

var readline = require('readline');

process.stdin.setEncoding('utf8');
var rl = readline.createInterface({
  input: process.stdin,
  terminal: false
});  

rl.on('line', readLine);

function readLine (line) {...}

我收到以下错误消息:

TypeError:a.ac不是函数     在Function.be.w(/Users/tinatuh/Workspace/AlgorithmicToolbox-Coursera/main.js:212:47)     at(/Users/tinatuh/Workspace/AlgorithmicToolbox-Coursera/main.js:211:409)     在Gc(/Users/tinatuh/Workspace/AlgorithmicToolbox-Coursera/main.js:99:59)     在Jc(/Users/tinatuh/Workspace/AlgorithmicToolbox-Coursera/main.js:108:60)     在对象。 (/Users/tinatuh/Workspace/AlgorithmicToolbox-Coursera/main.js:212:506)     在Module._compile(module.js:641:30)     在Object.Module._extensions..js(module.js:652:10)     在Module.load(module.js:560:32)     在tryModuleLoad(module.js:503:12)     在Function.Module._load(module.js:495:3)

1 个答案:

答案 0 :(得分:2)

您认为ClojureScript/Closure compilation aggressively renames functions and variables to make the output JavaScript code smaller使用了a sample project using externs中的高级优化。

您可能会尝试使用简单(:simple)优化,或提供外部定义,以帮助Closure编译器正确处理您的库代码(引用的网页包含指向{{3}}的链接)。< / p>

您的代码中还有另一个问题,即您如何调用readline.createInterface:它需要选项对象,而您传递的是明确的选项值。你需要像下面这样打电话:

(.createInterface readline
                  #js {:input js/process.stdin
                       :output js/process.stdout})