小编ama*_*loy的帖子

我是否重新发明了(方形)轮子?

我们应该知道,Clojure map可以应用于一个序列:

(map #(* %1 %1) [1 2 3])           ; (1)
Run Code Online (Sandbox Code Playgroud)

..或多个,以这种方式:

(map vector [0 1] [2 1])           ; (2)
;=> ([0 2] [1 1])
Run Code Online (Sandbox Code Playgroud)

现在我想获得与(2)相同的结果,但我将参数存储在序列中.换句话说,以下内容未给出所需的结果:

(map vector [[0 1] [2 1]])         ; (3)
;=> ([[0 1]] [[2 1]])
Run Code Online (Sandbox Code Playgroud)

所以我写了这个简单的宏,其中umap代表"unsplice map":

(defmacro umap [fun args-list]
  "umap stands for unspliced map.
  Let args-list be a list of args [a1 a2 ... an].
  umap is the same of (map fun a1 a2 .. an)"
  `(map ~fun ~@args-list))
Run Code Online (Sandbox Code Playgroud)

显然它就像一个魅力:

(umap vector [[0 …
Run Code Online (Sandbox Code Playgroud)

macros clojure map

3
推荐指数
2
解决办法
291
查看次数

Clojure Agent问题 - 使用发送

我对以下代码有几个问题:

(import 
 '(java.awt Color Graphics Dimension)
 '(java.awt.image BufferedImage)
 '(javax.swing JPanel JFrame))

(def width 900)
(def height 600) 

(defn render
 [g]
 (let [img (new BufferedImage width height 
                 (. BufferedImage TYPE_INT_ARGB))
       bg (. img (getGraphics))]
   (doto bg
      (.setColor (. Color white))
      (.fillRect 0 0 (. img (getWidth)) (. img (getHeight)))
      (.setColor (. Color red))
      (.drawOval 200 200 (rand-int 100) (rand-int 50)))
   (. g (drawImage img 0 0 nil))
   (. bg (dispose))
   ))

(def panel (doto (proxy [JPanel] []
                        (paint [g] (render g))) …
Run Code Online (Sandbox Code Playgroud)

clojure agents

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

用未知的钥匙解构地图的地图

我有以下作为一个例子:

(def _t2 {:oxnard {:value-type "string" :rec-name "foo"}})
Run Code Online (Sandbox Code Playgroud)

其中:oxnard动态和未知的先验功能,包含的地图由众所周知的密钥名称组成(例如:value-type:rec-name).

我试图在不知道外部map关键字的情况下编写具有解构的函数,例如:

(defn if-foo? [ignoremapfirstkey & 
  {:keys [value-type rec-name]}] 
  (= rec-name "foo"))
Run Code Online (Sandbox Code Playgroud)

或类似的; 但是,我似乎无法绕过外部密钥名称而不为人所知.

clojure

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

clojure destructuring vs haskell-like argument pattern matching

来自Haskell我发现在Clojure中很难遍历某些数据类型.在Haskell中,如果我喜欢在类型上做一些递归,在大多数基本情况下就像

foo (x : [])     = Just value
foo (x : y : xs) = bar y (foo xs)
foo _            = Nothing
Run Code Online (Sandbox Code Playgroud)

很好.

但我认为Clojure的解构并不像Haskell的模式匹配那么强大.是否有一个很好的惯用方法来完成我想要做的事情?举个例子,如果我有一个列表/向量,当没有更多元素时,如何匹配一个案例?

haskell functional-programming clojure

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

Clojure:如何开启Java类的Case

我在clojure中有一个java类,它来自一个返回类的方法.我想要打开这些,如下:

            (case type
                java.lang.String (println "Found String" name)
                java.lang.Long (println "Found Long" name)
                java.nio.ByteBuffer (println "Found ByteBuffer" name)
                java.lang.Boolean (println "Found Boolean" name)
                java.math.BigDecimal (println "Found BigDecimal" name)
                java.lang.Double (println "Found Double" name)
                java.lang.Float (println "Found Float" name)
                java.net.InetAddress (println "Found InetAddress" name)
                java.lang.Integer (println "Found Integer" name)
                java.util.Date (println "Found Date" name)
                java.util.UUID (println "Found UUID" name)
                java.math.BigInteger (println "Found BigInteger" name)
                java.util.List (println "Found List" name)
                java.util.Set (println "Found Set" name)
                java.util.Map (println "Found Map" name))
Run Code Online (Sandbox Code Playgroud)

但是,当我运行这个时,我得到了

 java.lang.IllegalArgumentException: …
Run Code Online (Sandbox Code Playgroud)

java clojure

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

如果我们在创建数据类型时派生Ord而不是Eq会发生什么?

我理解在haskell中如果我们创建一个数据类型派生Ord它也应该派生Eq,但为什么我们必须在定义中明确地写出它们?

haskell

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

我的Parser类的类型有什么问题?

这些天我一直有一些空闲时间,所以我决定学习一些haskell。

为了练习,我正在翻译我在SCALA的一个班级所做的项目。但是我对这部分代码有疑问。这很容易理解。

这个想法是为一些解析器建模,该解析器将使用一些字符串,并将其解析为一个包含解析元素“ output”和“ remainder”(无法解析的字符串的一部分)的ParserOutput。

我可以不用定义一个新的类就可以做到这一点(只使用数据“ MyParser”),但是我认为定义一个类很有趣,这样我就可以在一个地方定义我希望解析器工作的所有方法。

data ParserOutput a = 
    Failure | Success { output :: a, remainder :: String } 
        deriving (Show)

data MyParser t = MyParser (String -> ParserOutput t)

class Parser p where
    parse :: p -> String -> ParserOutput t

instance Parser (MyParser t) where
    parse (MyParser parserDefinition) = parserDefinition
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

data ParserOutput a = 
    Failure | Success { output :: a, remainder :: String } 
        deriving (Show)

data MyParser t = MyParser (String -> …
Run Code Online (Sandbox Code Playgroud)

haskell class instance

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

附加到Clojure循环中的数组

我正在尝试编写一个函数来将0和50之间的所有3和5的倍数相加,但是当我告诉它时,Clojure似乎决定不将正确的值添加到我的列表中.

(conj toSum counter)表单应该将当前数字附加到toSum数组,并且当循环退出时,(reduce + toSum)表单应该将数组中的所有内容一起添加.

就目前而言,当reduce调用函数时,toSum它总是为空的,因为conj函数没有按照它应该做的那样做.我必须搞砸我的逻辑,但我似乎无法弄明白.

(defn calculate [target]
  (loop [counter target
         toSum []]
        (if (= 0 counter)
            (reduce + toSum)
          (if (or (= 0 (mod counter 3)) (= 0 (mod counter 5)))
              (do (conj toSum counter)
                  (println toSum)
                  (recur (dec counter) toSum))    
            (recur (dec counter) toSum)))))
Run Code Online (Sandbox Code Playgroud)

clojure

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

Haskell powerset函数 - 如何避免无法将期望类型`IO t0'与实际类型`[[Integer]]'匹配

我有一个我试图在这里运行的powerset实现:http://rextester.com/runco​​de .我仍然遇到这个错误,无法弄清楚如何使它正确.我试图尽可能多地阅读有关哈希尔的IO,但这对我来说太难了.

import Control.Monad (filterM)
powerset = filterM (const [True, False])

main =  powerset[1,2]
Run Code Online (Sandbox Code Playgroud)

haskell

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

Clojure asterisks特殊形式(fn*,let*等...)

我发现很多"特殊形式"只是在背景中使用星号版本的宏(fn*,let*和所有其他版本).

例如,在fn的情况下,它将解构能力添加到fn*单独不提供的混合中.我试图找到一些关于fn*可以和不能自己做什么的详细文档,但我没那么幸运.

它肯定支持:

所以我的问题最终是,为什么不定义:

(fn& [& all-args] ...)
Run Code Online (Sandbox Code Playgroud)

这将是绝对最小的,可以通过宏提供所有arity选择(检查参数列表的大小,if/case语句直接代码路径,将前几个参数绑定到所需的符号等).

这是出于性能原因吗?也许有人甚至有一个链接到星号特殊形式的实际标准定义方便.

macros function clojure special-form

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