6

node.jsでClojureScriptを実行しようとしています

app1.js ターゲット コード: 動作中:

var rx = require("./lib/rx/rx.node.js");
var moment = require("./lib/moment/moment.js");

var timeStream = new rx.Observable.interval(300)
    .subscribe(function(index)
     {
        console.log(moment().format("dddd, MMMM Do YYYY, h:mm:ss a"));
    });

これまでの私の試み:

(ns rxcljs.core
  (:use [cljs.nodejs :only [require]])
)

(def rx (require "./lib/rx/rx.node.js"))
(def moment (require "./lib/moment/moment.js")) 

(-> rx
   (.Observable)
   (.interval 300)
   (.subscribe #(->> (->(moment) 
                        (.format "dddd, MMMM Do YYYY, h:mm:ss a" )
                      )
                     (.log js/console)
                 )
    )
)

app.js実際のコンパイル出力: 動作していません

.....
.....
cljs.nodejs = {};
cljs.nodejs.require = require;
cljs.nodejs.process = process;
cljs.core.string_print = cljs.nodejs.require.call(null, "util").print;
var rxcljs = {core:{}};
rxcljs.core.rx = cljs.nodejs.require.call(null, "./lib/rx/rx.node.js");
rxcljs.core.moment = cljs.nodejs.require.call(null, "./lib/moment/moment.js");
rxcljs.core.rx.Observable().interval(300).subscribe(function() {
  return console.log(rxcljs.core.moment.call(null).format("dddd, MMMM Do YYYY, h:mm:ss a"))
});

エラー:

/...../rxcljs/app.js:12726
rxcljs.core.rx.Observable().interval(300).subscribe(function() {
                            ^
TypeError: Cannot call method 'interval' of undefined

ご意見をお聞かせください。


回答編集

ミハルに感謝:

(ns rxcljs.core
  (:use [cljs.nodejs :only [require]])
)
(def log #(.log js/console %))

(def rx (require "./lib/rx/rx.node.js"))
(def moment (require "./lib/moment/moment.js"))

(-> rx .-Observable
   (.interval 300)
   (.subscribe #(->> (-> (moment) 
                         (.format "dddd, MMMM Do YYYY, h:mm:ss a")
                     )
                     (log) 
                )    
   )
)

rx 間隔は適切に機能していますが、瞬間形式の出力はまだおかしくなっています。

4

1 に答える 1

4

(.Observable rx)ClojureScript では常にメソッド呼び出しです。プロパティへのアクセスには、(.-Observable rx)またはを使用する必要があります(aget rx "Observable")1

これを念頭に置いて、timeStream定義を ClojureScript で次のように書き直すことができます。

(def time-stream
  (.. rx
      -Observable            ;; property access
      (interval 300)         ;; method call
      (subscribe (fn [index] ...))))

js/rxcljs.core.rx.Observableこれがよりきれいな場合は、これを使用することもできます (js魔法の名前空間により、シンボルの名前部分として指定されたリテラル JavaScript 識別子がコンパイルされた出力で使用されます。特に、これは、示されているように、名前空間プレフィックスを自分で指定する必要があることを意味します)。ここ)。


1 Clojure では、 に(.foo x)応じてメソッド呼び出しまたはプロパティ アクセスになる可能性があるxため、方言の違いであることに注意してください。

于 2013-07-04T16:20:13.663 に答える