node.js上的ClojureScript,代码 [英] ClojureScript on node.js, code

查看:113
本文介绍了node.js上的ClojureScript,代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在node.js上执行ClojureScript



app1.js 目标代码:working:

  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 dddd,MMMM Do YYYY,h:mm:ss a));
});

core.cljs 我到目前为止尝试:

 (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#( - >> b(.formatdddd,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:无法调用未定义的方法'interval'

请咨询。




回答EDIT



 (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)
(.formatdddd,MMMM Do YYYY,h:mm:ss a)

b $ b)


rx间隔正常工作尽管

解决方案

(。Observable rx)总是在ClojureScript中调用方法;对于属性访问,必须使用(.- Observable rx)或可能(aget rxObservable)。 sup> 1



考虑到这一点,您的 timeStream 定义可以在ClojureScript中重写:

 (def time-stream 
(.. rx
-Observable ;; property access
(interval 300);;方法调用
(subscribe(fn [index] ...))))

如果你发现这个偏好( js js / rxcljs.core.rx.Observable c $ c> magic namespace使得作为符号的名称部分给出的文本JavaScript标识符在编译的输出中使用;特别地,这意味着您需要自己提供命名空间前缀,如下所示)。






1 请注意,在Clojure中,(。foo x)可能是一个方法调用或属性访问,取决于 x ,所以这是方言之间的区别。


I am trying to run ClojureScript on node.js

app1.js target code: working:

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"));
    });

core.cljs my try so far:

(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 the actual compile output: not working

.....
.....
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"))
});

The error:

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

Please advice.


Answer EDIT

Thanks to Michal:

(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 interval working properly, moment format output is still weired though.

解决方案

(.Observable rx) is always a method call in ClojureScript; for property access, you must use (.-Observable rx) or perhaps (aget rx "Observable").1

With this in mind, your timeStream definition could be rewritten in ClojureScript like so:

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

You could also use js/rxcljs.core.rx.Observable if you find this prettier (the js magic namespace causes the literal JavaScript identifier given as the name part of the symbol to be used in the compiled output; in particular, this means you need to supply the namespace prefix yourself, as shown here).


1 Note that in Clojure, (.foo x) might be a method call or a property access depending on the x, so that's a difference between dialects.

这篇关于node.js上的ClojureScript,代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆