2014-10-03 31 views
2

我試圖修改爲用於Clojure語言的Intellij的插件Cursive。我已經通過Lein導入了一個非常標準的新應用程序,現在嘗試使用幾個core.async構造。Clojure core.async和clojure.core名稱空間元素似乎碰撞

這裏的項目定義:

(defproject app "0.1.0-SNAPSHOT" 
    :description "Clojure project illustrating basic core.async constructs" 
    :dependencies [[org.clojure/clojure "1.5.1"] 
      [org.clojure/core.async "0.1.346.0-17112a-alpha"]]) 

和源:

(ns app.core) 

(require '[clojure.core.async :as async :refer :all]) 

(let [c (chan 10)] 
    (>!! c "hello") 
    (println (<!! c)) 
    (close! c)) 

基本Clojure的構建工作,沒有任何問題。但是,在雷音加入core.async依賴後,每次我嘗試運行一段代碼,這些警告突然出現:

WARNING: partition-by already refers to: #'clojure.core/partition-by in namespace: app.core, being replaced by: #'clojure.core.async/partition-by 
WARNING: map already refers to: #'clojure.core/map in namespace: app.core, being replaced by: #'clojure.core.async/map 
WARNING: into already refers to: #'clojure.core/into in namespace: app.core, being replaced by: #'clojure.core.async/into 
WARNING: reduce already refers to: #'clojure.core/reduce in namespace: app.core, being replaced by: #'clojure.core.async/reduce 
WARNING: partition already refers to: #'clojure.core/partition in namespace: app.core, being replaced by: #'clojure.core.async/partition 
WARNING: take already refers to: #'clojure.core/take in namespace: app.core, being replaced by: #'clojure.core.async/take 
WARNING: merge already refers to: #'clojure.core/merge in namespace: app.core, being replaced by: #'clojure.core.async/merge 

這似乎是某種形式的命名空間衝突。

有沒有簡單的方法來解決這個問題?

回答

4

命名空間存在的原因是爲了給上下文名,使他們可以重複使用。這只是一個例子。通過使用:參考:所有你試圖拉入與clojure.core函數衝突的許多函數。我通常只攜帶core.async的更多語法元素的一個子集到我的NS和其餘創建別名:

(require '[clojure.core.async :as async :refer [>! <! >!! <!! go]]) 

大部分重疊的名字實際上是現在過時,並將在未來作爲被刪除傳感器不再需要它們。例如,您不會使用clojure.core.async.take,而是使用Clojure 1.7創建一個帶clojure.core.take變換器的chan。

1

原來有一種方法可以排除元素。它有點狡猾,因爲我認爲core.async非常流行,會有一個默認方法來避免基本名稱衝突。但很可惜,這裏的修改NS /需要這讓我起來發言,並運行:

(ns app.core 
    (:refer-clojure :exclude [map reduce into partition partition-by take merge]) 
    (:require [clojure.core.async :refer :all :as async])) 

發現here on Github

+2

問題不在異步,它在你的使用:參考:所有。這是一個壞主意,因爲當你在查看代碼時,你無法知道函數來自哪個名稱空間。 – 2014-10-03 05:47:39

+0

我曾經認爲這是從[core.async演練](https://github.com/clojure/core.async/blob/master/examples/walkthrough.clj)中提取表達式的標準導入方式。無論如何,這現在更加清晰。謝謝! – thetwan 2014-10-03 14:21:41