- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个库 xx,其命名空间为 xx.core
,我用纯 Clojure 编写它,打算同时针对 Clojure 和 ClojureScript。这样做的实际方法似乎是使用 lein-cljsbuild’s crossovers and conditional comments .到现在为止还挺好。 这个前提现在已经过时了。 lein-cljsbuild 已被弃用,取而代之的是 reader conditionals ,还有许多其他命名空间/宏 ClojureScript 增强功能。见updated answer以下。
假设 xx 有一堆变量,我希望它的用户能够在 Clojure 和 ClojureScript 中使用。这些可以分为三种类型的变量。
.cljs
分开。命名空间在他们自己的特殊
.clj
命名空间,所有宏必须与
xx.core
中的所有其他变量隔离开.
use-macro
或
require-macro
似乎只能访问宏。刚才我对此进行了测试;我尝试将所有内容(宏、type-1 vars 和 type-2 vars)简单地保存在一个单一的
xx/core.clj
文件,并在 ClojureScript 测试文件中使用
(:use-macro xx.core :only […])
引用它。然后编译器为 ClojureScript 文件引用的
WARNING: Use of undeclared Var
中的每个非宏变量发出
xx.core
消息。)
xx.core
,
xx.macro
, 和
xx.util
?…
最佳答案
这个问题的前提在几年前基本上已经过时了。通过这次更新,我正在尽自己的一份力量,不要让过时的信息污染网络。
与 Clojure 不同,ClojureScript 通常在与运行时分开的编译阶段编译宏。还有很多附带的复杂性。但是,由于多项改进,情况已大大改善。
从 version 1.7 in 2015 , Clojure 和 ClojureScript 现在支持 reader conditionals ,它允许在同一个 .cljc
中定义宏和函数Clojure、ClojureScript、Clojure CLR 或所有三个文件:#?(:clj …, :cljs …, :cljr …, :default …)
.仅此一项就可以缓解大部分问题。
此外,ClojureScript 本身现在对 ns
进行了多项增强。这为命名空间的用户消除了许多其他附带的复杂性。它们现在记录在 Differences from Clojure, § Namespaces 中。 .它们包括隐式宏加载、内联宏规范和自动别名 clojure
命名空间:
Implicit macro loading: If a namespace is required or used, and that namespace itself requires or uses macros from its own namespace, then the macros will be implicitly required or used using the same specifications. Furthermore, in this case, macro vars may be included in a :refer or :only spec. This oftentimes leads to simplified library usage, such that the consuming namespace need not be concerned about explicitly distinguishing between whether certain vars are functions or macros. For example:
(ns testme.core (:require [cljs.test :as test :refer [test-var deftest]]))
will result in test/is resolving properly, along with the test-var function and the deftest macro being available unqualified.Inline macro specification: As a convenience, :require can be given either :include-macros true or :refer-macros [syms…]. Both desugar into forms which explicitly load the matching Clojure file containing macros. (This works independently of whether the namespace being required internally requires or uses its own macros.) For example:
(ns testme.core
(:require [foo.core :as foo :refer [foo-fn] :include-macros true]
[woz.core :as woz :refer [woz-fn] :refer-macros [apple jax]]))is sugar for
(ns testme.core
(:require [foo.core :as foo :refer [foo-fn]]
[woz.core :as woz :refer [woz-fn]])
(:require-macros [foo.core :as foo]
[woz.core :as woz :refer [apple jax]]))Auto-aliasing
clojure
namespaces: If a non-existingclojure.*
namespace is required or used and a matching cljs.* namespace exists, thecljs.*
namespace will be loaded and an alias will be automatically established from theclojure.*
namespace to thecljs.*
namespace. For example:(ns testme.core (:require [clojure.test]))
will be automatically converted to
(ns testme.core (:require [cljs.test :as clojure.test]))`
关于macros - 双 Clojure/ClojureScript 库设计和宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13835031/
为什么该语言的名称是“Clojure”? 我用谷歌搜索了一下,在#clojure 中询问。到目前为止,还没有运气。 最佳答案 Rich Hickey(他是 Clojure 的设计者)对此的评论是 wi
我不明白为什么升级后会出现以下编译错误: Compiling addr-verify.core Exception in thread "main" java.lang.NoClassDefFound
我试图将从映射操作返回的(惰性)序列传递给另一个映射操作,以便我可以在第一个序列中查找元素。代码从文本文件(以行/列格式)解析一些足球装置,清理它,然后返回一张 map 。 这是代码: (ns fix
我想过滤一组,例如: (filter-set even? #{1 2 3 4 5}) ; => #{2 4} 如果我使用clojure.core/filter我得到一个不是集合的seq: (filte
(defn hi[](+ 5 6)) (hi) (defn hi[](+ 6 7)) (hi) 你好,我是 clojure 的新手。如上所述,我编写了两个具有相同名称的函数。我们可以在 cloj
我按照这个伪代码递归地将十进制转换为二进制。 findBinary(decimal) if (decimal == 0) binary = 0 else binar
我正在尝试学习 Clojure 并尝试定义这个简单的函数: user=> (defn triple [arg] (* 3 arg)) #'user/triple user=> (triple 1) 3
是->和 ->>宏只是为了使代码更具可读性还是它们还有其他特定功能? 最佳答案 线程优先( -> )和线程最后( ->> )是为了使代码更具可读性。但这已经很重要了! 它允许取消嵌套函数调用(示例取自
我在 http://www.learningclojure.com/2010/11/yet-another-way-to-write-factorial.html 上找到了这个代码,但我不明白 pop
我正在阅读 Programming Clojure 2nd edition,在第 49 页它涵盖了 Clojure 的 for 循环结构,它说它实际上是一个序列理解。 作者建议使用以下代码: (def
Clojure 中有双端队列吗?我的印象是 Clojure 的 PersistentQueue 是单端的(我错了吗?)。我需要能够从队列的任一端删除(即“pop”)和“peek”数据。我所说的双端队列
换句话说,有没有办法在看起来不像 (MACRO arg* ...) 的表单上触发宏扩展? . 举一个假设的例子: (defmacro my-var (do (printf "Using my-va
我很难理解懒惰。 有人能帮我理解为什么我下面的函数不是懒惰的吗 (defn my-red ([f coll] (my-red f (first coll) (rest coll) ))
在 Clojure 核心中决定参数函数顺序的规则是什么(如果有的话)? 类似 map 的函数和 filter期望数据结构作为最后一个 争论。 类似 assoc 的函数和 select-keys期待数据
我在 clojuredocs 上遇到过 completing 函数,但目前没有文档。 你能提供一些例子吗? 最佳答案 completing 用于扩充可能没有具有一元“完成”元数的一元重载的二元归约函数
这个现在支持吗?我能找到的唯一信息是来自维基的示例( https://github.com/clojure/core.match/wiki/Deftype-and-defrecord-matching
我正在关注“Clojure in Action”,对此我感到困惑: (defn with-log [function-to-call log-statement ] (fn [& args
对于下面的代码,箭头是宏还是函数名称中的简单字符? (来自 here) (defn file->map [file] ;; TODO ) 最佳答案 箭头是函数名称的一部分。有一个函数定义,不是
Clojure 的 range函数包含来自 start独家在end (如果提供)。核心库中是否有一个函数可以提供完全包含(开始和结束)的范围? 我发现在某些情况下必须调整最终值的代码 - 例如向下而不
当我尝试从 REPL 运行以下代码时(使用动态记录): (defrecord (symbol "rec2") (vec (map symbol ["f1" "f2"]))) 我收到错误 Compile
我是一名优秀的程序员,十分优秀!