小编A. *_*ebb的帖子

在Ruby中队列而不是方法链和规则而不是条件

Rich Hickey在他的简单轻松谈话中描述了Clojure和Haskell的范例.作为一个ruby/rails程序员(这是我真正知道的),我喜欢他的想法,但不理解其中的两个:

  • 使用队列,而不是方法链接
  • 规则而不是条件

改为使用队列

显然,在Rails中我们喜欢方法链接,但是我想要了解Ruby中的Queue在他描述它的方式(54:54在视频中):

如果事物A调用事物B,那么你只需要它.你有什么时间和地点.A必须知道B在哪里才能调用B.当发生这种情况时,无论什么时候发生都是在A做的时候.在那里贴一个队列.

规则与条件

他谈到不使用条件或切换语句而是使用规则(30:00在视频中).

对于Ruby来说,我根本就不了解.如何在不使用条件的情况下做出决定?

谢谢大家,贾斯汀

ruby paradigms haskell clojure

16
推荐指数
2
解决办法
795
查看次数

这种延续传递方式Clojure函数发生器如何工作?

这是来自Clojure的Joy,第2版.http://www.manning.com/fogus2/

 (defn mk-cps [accept? kend kont] 
   (fn [n] 
     ((fn [n k] 
        (let [cont (fn [v] (k ((partial kont v) n)))] 
          (if (accept? n) 
            (k 1) 
            (recur (dec n) cont)))) 
      n kend))) 
Run Code Online (Sandbox Code Playgroud)

然后做一个阶乘:

(def fac (mk-cps zero? identity #(* %1 %2)))
Run Code Online (Sandbox Code Playgroud)

我的理解:

  • mm-cps生成一个函数,它接受n,fn [n]
  • 内部函数fn [nk]最初用nkend调用
  • 延续功能CONT [V]被定义为(主叫ķ用的局部应用KONTv作为第一个参数和)Ñ作为第二个参数.为什么要用partial而不是简单地写(k (cont v n))
  • 如果accept?函数通过,则完成递归,应用于k1.
  • 否则,使用递减的n recur重复返回 …

continuations clojure continuation-passing

12
推荐指数
1
解决办法
1634
查看次数

习惯性/高效的Clojure方式交叉两个先验分类的向量?

我有一对向量xy独特的项目,我知道每个项目都要排序.我希望有两者的交集,维持排序顺序.理想情况下,结果将是另一个向量,用于快速随机访问.

下面的代数仅仅是为了举例,我xy将会预先分类和预先分开(它们实际上是时间样本).

(defn gen-example [c] (-> (repeatedly c #(-> c rand int)) distinct sort vec))

user=> (def x (gen-example 100000)) (count x)
#'user/x
63161
user=> (def y (gen-example 100000)) (count y)
#'user/y
63224
Run Code Online (Sandbox Code Playgroud)

我知道Clojure clojure.set/intersection可以用于sorted-set.我xy具有相同的属性(排序不同的元素)但不是相同的类型.

问题1:是否有转换更好/更快的方式x,并ysorted-set除S (apply sorted-set x)因为他们已经明显和排序?

user=> (time (def ssx (apply sorted-set x)))
"Elapsed time: 607.642592 msecs"
user=> (time (def ssy (apply sorted-set y)))
"Elapsed …
Run Code Online (Sandbox Code Playgroud)

vector clojure

10
推荐指数
1
解决办法
1443
查看次数

如何使用clojure.edn/read来获取文件中的一系列对象?

引入了Clojure 1.5 clojure.edn,其中包括一个需要a的读取功能PushbackReader.

如果我想阅读前五个对象,我可以这样做:

(with-open [infile (java.io.PushbackReader. (clojure.java.io/reader "foo.txt"))]
  (binding [*in* infile]
    (let [edn-seq (repeatedly clojure.edn/read)]
      (dorun (take 5 (map println edn-seq))))))
Run Code Online (Sandbox Code Playgroud)

我怎样才能打印出所有对象?考虑到其中一些可能是nils,似乎我需要检查EOF或类似的东西.我希望有一系列类似于我得到的对象line-seq.

clojure edn

10
推荐指数
1
解决办法
5381
查看次数

clojure:with-redefs不能与clojure.core函数一起使用?

我有一个问题with-redefs.以下示例无法按预期工作.In findmax,clojure.core/max始终在with-redefs语句中调用而不是匿名函数 .

(defn findmax [x y]
  (max x y))

(with-redefs (clojure.core/max (fn [x y] (- x y)))
  (findmax 2 5))
Run Code Online (Sandbox Code Playgroud)

当我进行以下更改时,一切都按预期工作:

(defn mymax [x y]
  (max x y))

(defn findmax [x y]
  (mymax x y))

(with-redefs (my/max (fn [x y] (- x y)))
  (findmax 2 5))
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

clojure

8
推荐指数
1
解决办法
662
查看次数

与访问用户定义类型的字段相比,VBA类模块属性是否较慢?

我一直在尝试使用类模块开发一个宏,但是与UDT相比,get/let似乎需要很长时间.我真的很感兴趣为什么会这样,有人可以解释一下吗?我只发现了讨论功能/子执行的讨论,这似乎同样快.

目前的问题是设置一个属性,该类需要大约3000毫秒(200万次)和120毫秒使用UDT进行相同操作.

我正在尝试决定是否应该建议宏开发人员在需要获取或设置大量属性时避免使用类模块.只使用这个作为我应该的数据,但也许你有不同的见解.

我想明白为什么这么慢.也许我只是做错了什么.

示例代码:

Public Type Participant
    Name As String
    Gender As Integer
End Type

Public Declare Function GetTickCount Lib "kernel32.dll" () As Long

Sub TimeUDT()
   Dim i As Long
   Dim startMs As Long
   startMs = GetTickCount
   Dim participants(1 To 1000000) As Participant
   For i = 1 To 1000000
      participants(i).Name = "TestName"
      participants(i).Gender = 1
   Next
   Debug.Print GetTickCount - startMs
End Sub

Sub TimeCls()
   Dim i As Long
   Dim startMs As Long
   Dim participants(1 To 1000000) As New clsParticipant …
Run Code Online (Sandbox Code Playgroud)

excel vba excel-vba

5
推荐指数
1
解决办法
1730
查看次数

让Leiningen和Cygwin工作

我想让Leiningen和Cygwin一起工作.

我认为我遇到的一个问题是我在"C:\ Program Files\Java ..."目录中安装了Java.这个空间似乎引起了问题.

当我尝试在Cygwin中运行lein脚本时,我收到以下错误:

./lein: line 325: C:\Program Files\Java\jdk1.8.0_05\bin\java.exe : command not found
Run Code Online (Sandbox Code Playgroud)

然后我认为这个问题就是空间.所以我改变了第325行:

"$LEIN_JAVA_CMD" \
Run Code Online (Sandbox Code Playgroud)

到(用于测试目的):

"$'C:\\\Program Files\\\Java\\\jdk1.8.0_05\\\bin\\\java.exe'" \
Run Code Online (Sandbox Code Playgroud)

但是,我仍然收到此错误:

./lein: line 325: $'C:\\Program Files\\Java\\jdk1.8.0_05\\bin\\java.exe' : commande introuvable
Run Code Online (Sandbox Code Playgroud)

但是,这个文件显然存在:

Owner@Owner-PC ~
$ ls -alh $'C:\\Program Files\\Java\\jdk1.8.0_05\\bin\\java.exe'
-rwxr-xr-x 1 Owner None 187K  8 mai   15:39 C:\Program Files\Java\jdk1.8.0_05\bin\java.exe
Run Code Online (Sandbox Code Playgroud)

lein脚本似乎正在为Cygwin正确配置Leiningen,但我无法让它工作.

请注意,我之前 Cygwin 之外安装了Leiningen (我在Windows的普通shell中运行它).

我的设置,任何想法可能有什么问题?

cygwin clojure leiningen

5
推荐指数
1
解决办法
2394
查看次数

Clojure defrecord序列化ClassNotFoundException

我试图将我的一个记录序列化为人类可读的格式.虽然使用Java序列化器进行序列化工作正常但我正在尝试使用print-dup.我面临的问题是,在编写记录时,可以很好地读取记录结果clojure.lang.LispReader $ ReaderException:java.lang.ClassNotFoundException:common.dummy.Doodh.我搞乱了命名空间或什么?请注意,这不是Java序列化的问题.以下代码以最简单的形式

(ns common.dummy)

   (defrecord Doodh [id name])

   (defn output [filename obj]
    (def trr(map->Doodh {:id "moooh" :name "Cows"}))
    (def my-string (binding [*print-dup* true] (pr-str trr)))
    (spit filename my-string)
   )

   (defn pull [filename]
     (def my-data (with-in-str (slurp filename) (read)))
     (println my-data)
   )
Run Code Online (Sandbox Code Playgroud)

文本文件内容:

#common.dummy.Doodh["moooh", "Cows"]
Run Code Online (Sandbox Code Playgroud)

serialization record clojure

3
推荐指数
1
解决办法
710
查看次数

在语法引用中不断函数不起作用

如果我这样做:

(eval (let [f (fn [& _] 10)]
    `(~f nil)))
Run Code Online (Sandbox Code Playgroud)

它按预期返回 10。

虽然如果我这样做:

(eval (let [f (constantly 10)]
    `(~f nil)))
Run Code Online (Sandbox Code Playgroud)

它抛出一个异常:

IllegalArgumentException No matching ctor found for 
  class clojure.core$constantly$fn__... clojure.lang.Reflector.invokeConstructor 
Run Code Online (Sandbox Code Playgroud)

既然两者是等价的,为什么代码总是不起作用?

clojure

3
推荐指数
1
解决办法
147
查看次数

更好的序列重复卸妆

我做了这个函数来删除连续的重复项,但我想知道是否有更好或更短的方式来表达它使用distinct或类似的东西.

(defn duplicates
  [s]
  (reduce 
    #(if-not (= (last %1) %2) 
      (conj %1 %2) %1) 
    [] s))
Run Code Online (Sandbox Code Playgroud)

clojure

3
推荐指数
1
解决办法
1014
查看次数

clojure代码给出错误:java.lang.Integer无法强制转换为clojure.lang.IFn

嗨,我有这个学校项目,我差不多完成了所以我不需要代码的帮助,问题是我从来没有在clojure中编码但是为了这个任务必须尝试并使用绑定表单捕获clojure中的宏,有一些REPL命令可以为赋值传递给出不同的响应,

无论如何我得到一个错误,我一直在谷歌搜索,但没有任何具体的这个问题和大多数解释基本上需要有自己的解释似乎没有什么似乎是初学者适应所以它对我没有多大帮助.

(defmacro safe [bindings & code]
(if (list? bindings)
`(try 
   ~bindings 
  (catch Throwable except# except#)) 

(if (= (count bindings) 0)
  `(try ~code 
     (catch Throwable except# except#)) 

  `(let ~(subvec bindings 0 2)

     (try
       (safe ~(subvec bindings 2) ~@code)
       (catch Throwable except# except#) 

       (finally
         (. ~(bindings 0) close))))))) ;;safe



(def divider(safe (/ 1 0)))
(def reader (safe [s (FileReader. (java.io.File. "C:/text.txt"))] (. s read)))
Run Code Online (Sandbox Code Playgroud)

所以我得到的错误是

=> (def v (safe [s (FileReader. (java.io.File. "C:/text.txt"))] (. s read)))
#'myProject.core/v
=> v
#<ClassCastException java.lang.ClassCastException: …
Run Code Online (Sandbox Code Playgroud)

clojure classcastexception

1
推荐指数
1
解决办法
1229
查看次数