【问题标题】:Clojurescript using nodejs to read stdinClojurescript 使用 nodejs 读取标准输入
【发布时间】:2017-11-10 07:44:41
【问题描述】:

我无法使用 ClojureScript 从 NodeJs 读取标准输入。理想情况下,最终命令是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) 在 (/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)

【问题讨论】:

    标签: javascript node.js clojurescript


    【解决方案1】:

    您似乎在 ClojureScript/Closure compilation 其中 aggressively renames functions and variables to make the output JavaScript code smaller 中使用了高级优化。

    您可以尝试改用简单的 (:simple) 优化或提供外部定义,以帮助 Closure 编译器正确处理您的代码和库代码(引用的网页包含指向 a sample project using externs 的链接)。

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

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

    【讨论】:

    • 外部是标准输入的主要问题。 @piotrek-bzdyl 建议使用 simple 使我能够阅读输入。
    猜你喜欢
    • 2019-11-27
    • 2011-06-27
    • 1970-01-01
    • 2013-03-30
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    相关资源
    最近更新 更多