2013-03-06 38 views
7

Tôi đang tìm cách xác định các hàm Clojurescript trong không gian tên chung của Javascript lúc biên dịch. Những gì tôi có nghĩa là bằng cách biên dịch-thời gian là tôi muốn trình biên dịch Clojurescript để sản lượng này: function some_fn() { }. Tôi biết rằng điều này không phải là thành ngữ và mọi thứ nên nằm trong một không gian tên nhưng môi trường mà tôi buộc tôi phải làm điều này. Vì vậy, lý tưởng giống như (defn ^:global some-fn []) sẽ hoạt động tương tự như cách hoạt động của :export nhưng bỏ qua không gian tên.Làm thế nào để xác định một hàm clojurescript trong không gian tên chung javascript tại thời gian biên dịch?

Tôi biết phương pháp thời gian chạy để xác định các chức năng toàn cầu bằng goog.global, ví dụ: (set! goog.global.someFunction some-clojure-fn) nhưng điều này không hoạt động trong môi trường của tôi.

+2

Bạn có biết rằng nếu bạn chú thích hàm của mình bằng '^: export', bạn có thể tham chiếu trực tiếp từ javascript? ví dụ. 'my.name.space.some_fn()' –

+0

Có tôi. Tôi sợ rằng tôi thực sự muốn nó là một chức năng cấp cao nhất bởi vì tôi không thể đối phó với tên stuff.space.prefix. –

+0

Câu trả lời của Kanaka là những gì bạn đang làm sau đó. Cửa sổ là nơi công cụ cấp cao nhất hoạt động. –

Trả lời

8

lẽ bạn có thể định nghĩa nó trong một không gian tên và sau đó phơi bày nó trong cửa sổ (hoặc GLOBAL hoặc tùy thuộc vào môi trường của bạn này) đối tượng:

(defn foo [x] (* 2 x)) 
(aset js/window "foo" myns/foo) ;; where myns is where foo is defined 

Sau đó, bạn sẽ có thể gọi foo từ cửa sổ (đó là không gian tên JavaScript chung trong trình duyệt).

Cập nhật: Theo đề nghị của @TerjeNorderhaug, bạn có thể đặt một biến trong không gian tên toàn cầu như thế này:

(set! js/foo foo) 
+1

Hoặc đặt toàn cục bằng '(set! Js/foo foo)' –

2

Thiết lập một var javascript để một chức năng ẩn danh Clojurescript sẽ xác định các chức năng biên soạn trong không gian tên chung của Javascript:

(set! js/some_fn (fn []))

Gọi hàm hoạt động như mong đợi:

(js/some_fn)

Các vấn đề liên quan