user=> (def r (range 1))
user=> (for [a r, b r, c r, d r, e r, f r, g r, h r :when (and (= 0 a) (not= 1 b))]
(list a b c d e f g h))
((0 0 0 0 0 0 0 0))
user=> (doseq [a r, b r, c r, d r, e r, f r, g r, h r :when (and (= 0 a) (not= 1 b))]
(println (list a b c d …Run Code Online (Sandbox Code Playgroud) 我并不是说这是一个主观问题 - 我试图理解为什么with-meta语言正是这样.我意识到它可以用于许多目的(也可以eval,但它在特定情况下的使用是坏设计的标志).从设计角度来看,Clojure的元数据结构有什么独特的用途?它主要用于文档吗?是糖吗?
什么是强大的应用程序with-meta/ meta?在什么情况下这是一个坏主意?你能举例说明如何使用元数据做一些不可能/困难/乏味的事情吗?
如果我编写一个使用symb#快捷方式创建gensym然后绑定为全局变量的宏,则会反复生成完全相同的符号.但是,如果我gensym手动调用它可以正常工作.很简单的例子:
(defmacro indirection
[name & body]
`(do (def name# ~@body)
(defn ~name [] name#)))
(indirection foo 3)
(foo) ; ? 3
(indirection goo 5)
(goo) ; ? 5
(foo) ; ? 5
Run Code Online (Sandbox Code Playgroud)
如果你使用macroexpand以下问题很明显:
(macroexpand '(indirection foo 3))
(do (def name__2863__auto__ 3) (clojure.core/defn foo [] name__2863__auto__))
(macroexpand '(indirection foo 3))
(do (def name__2863__auto__ 3) (clojure.core/defn foo [] name__2863__auto__))
Run Code Online (Sandbox Code Playgroud)
如果我gensym长途跋涉,这个问题就会消失:
(defmacro redirection
[name & body]
(let [rename (gensym)]
`(do (def ~rename ~@body)
(defn ~name …Run Code Online (Sandbox Code Playgroud) 我在这里彻底搞砸了.我正在使用循环重复形式,我正在使用doall,但我仍然得到大循环的堆栈溢出.我的Clojure版本是1.5.1.
背景:我正在训练神经网络来模仿XOR.该功能xor是前馈功能,接受权重和输入并返回结果; 该函数b-xor是反向传播函数,它根据最后一次调用的结果返回更新的权重xor.
以下循环运行得很好,运行速度非常快,并返回结果,并根据返回的结果,完美地训练权重:
(loop [res 1 ; <- initial value doesn't matter
weights xorw ; <- initial pseudo-random weights
k 0] ; <- count
(if (= k 1000000)
res
(let [n (rand-int 4)
r (doall (xor weights (first (nth xorset n))))]
(recur (doall r)
(doall (b-xor weights r (second (nth xorset n))))
(inc k)))))
Run Code Online (Sandbox Code Playgroud)
但是,当然,这只能给我最后一次运行的结果.显然我想知道为了获得这个结果而训练了多少重量!以下循环,只返回值更改,溢出:
(loop [res 1
weights xorw
k 0] …Run Code Online (Sandbox Code Playgroud) 在Clojure中,逗号被视为空格.这有一个简单的目的:它帮助人们阅读代码.
我想指定另一个字符应该被视为空格.这可能吗?
如果你很好奇,那就是ε/ε.如果我可以输入(for [i ? set1, j ? set2] (* i j)),我认为这很可爱.
提前致谢.
我想拿一个数字,20和一个列表.'(1 2 3 4 5 6 7 8 9 10),并返回一个集合,其中包含原始列表中每个值的两个值:当使用该值潜水20时,原始值与余数配对.如果原始值以某种方式键入剩余部分会很好,这样我就可以轻松地检索产生特定余数的每个数字.基本上我想要一些功能func:
user=> (func 20 '(1 2 3 4 5 6 7 8 9 10))
'(:0 1, :0 2, :2 3,... :20 0)
Run Code Online (Sandbox Code Playgroud)
然而,我正在寻找如何遍历列表的难以置信的困难时期.有人可以帮助我理解如何独立使用列表的元素,然后如何返回20除以的元素,如果它返回一个余数?
我的想法是在计算平方根的程序中使用这样的东西.如果数字由余数键入,那么我可以查询集合以获得将输入除以0的余数的所有数字.
这是我的初步方法.
;; My idea on the best way to find a square root is simple.
;; If I want to find the square root of n, divide n in half
;; Then divide our initial number (n) by all numbers in the range …Run Code Online (Sandbox Code Playgroud)