我正在尝试创建一个生成Clojure的宏,deftype并且需要生成类型提示.我目前有一些测试代码:
(defmacro test-macro [n]
(let [obj-sym (gensym "obj")
p0 (with-meta 'p0 {:tag java.lang.Object})
p1 (with-meta 'p1 {:tag java.lang.Integer/TYPE})
r0 (with-meta 'remove {:tag java.lang.Boolean/TYPE})
r1 (with-meta 'remove {:tag java.lang.Object})]
`(deftype ~n [~obj-sym]
java.util.List
(~r0 [_ ~p0] (.remove ~obj-sym ~p0))
(~r1 [_ ~p1] (.remove ~obj-sym ~p1)))))
Run Code Online (Sandbox Code Playgroud)
当它返回时:
(test-macro test-it)
;clojure.lang.Compiler$CompilerException: java.lang.IllegalArgumentException: Must hint overloaded method: remove, ...
Run Code Online (Sandbox Code Playgroud)
作为指导,它应该产生相当于:
(clojure.core/deftype ThisWorks [obj-5546]
java.util.List
(#^"boolean" remove [_ ^java.lang.Object p0-object] (.remove obj-5546 p0-object))
(^{:tag "java.lang.Object"} remove [_ ^int p0-int] (.remove obj-5546 p0-int)))
Run Code Online (Sandbox Code Playgroud)
看起来我的类型暗示了错误的东西,或者元数据没有被传递.除了针对当前问题的修复之外,如果你可以帮助解决更普遍的"元"问题,那么奖励积分:如何调试操作元数据的宏作为宏扩展在这里不是很有用.. …
如果我在Haskell中有一个单独的链表:
data LL a = Empty | Node a (LL a) deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)
我可以轻松地实现在结尾和开头插入的方法.但是在特定元素之后或之前插入呢?如果我有一个LL的Integer,我可以在Haskell区分之间插入4含有特定的节点之后1,而不是第一个1,它处理列表时看到的?
Node 1 (Node 2 (Node 3 (Node 1 Empty)))
Run Code Online (Sandbox Code Playgroud)
我很好奇一个insertAfter方法看起来如何能够指定"在包含1的特定节点之后插入5".如果我想在第一个节点包含之后插入1,我是否必须传入整个列表来指定它,并且仅针对最后一个节点Node 1 Empty?
我不确定将此作为"对象相等"来解决是否正确 - 但我想知道是否有一种方法可以在这样的数据结构中引用具有相同有效负载的类型的特定元素.
我正在尝试编写一个函数来将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) 我有一个我试图在这里运行的powerset实现:http://rextester.com/runcode .我仍然遇到这个错误,无法弄清楚如何使它正确.我试图尽可能多地阅读有关哈希尔的IO,但这对我来说太难了.
import Control.Monad (filterM)
powerset = filterM (const [True, False])
main = powerset[1,2]
Run Code Online (Sandbox Code Playgroud) 我发现很多"特殊形式"只是在背景中使用星号版本的宏(fn*,let*和所有其他版本).
例如,在fn的情况下,它将解构能力添加到fn*单独不提供的混合中.我试图找到一些关于fn*可以和不能自己做什么的详细文档,但我没那么幸运.
它肯定支持:
&/ catchall指标
(fn* [x & rest] (do-smth-here...))
Run Code Online (Sandbox Code Playgroud)并且好奇地还有arity的超载,如:
(fn* ([x] (smth-with-one-arg ...)
([x y] (smth-with-two-args ...))
Run Code Online (Sandbox Code Playgroud)所以我的问题最终是,为什么不定义:
(fn& [& all-args] ...)
Run Code Online (Sandbox Code Playgroud)
这将是绝对最小的,可以通过宏提供所有arity选择(检查参数列表的大小,if/case语句直接代码路径,将前几个参数绑定到所需的符号等).
这是出于性能原因吗?也许有人甚至有一个链接到星号特殊形式的实际标准定义方便.
我需要一个只在每个其他元素上映射函数的函数,例如
(f inc '(1 2 3 4))
=> '(2 2 4 4)
Run Code Online (Sandbox Code Playgroud)
我提出了:
(defn flipflop [f l]
(loop [k l, b true, r '()]
(if (empty? k)
(reverse r)
(recur (rest k)
(not b)
(conj r (if b
(f (first k))
(first k)))))))
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现这一目标?
由于Ord是Eq的一个子类,我发现很难理解如何使该类的newtype实例看起来像.
我设法做到了这一点:
newtype NT1 = NT1 Integer
instance Eq NT1 where
(NT1 x) == (NT1 y) = x == y
instance Ord NT1 where
(NT1 x) `compare` (NT1 y) = x `compare` y
Run Code Online (Sandbox Code Playgroud)
如果我为考试有一个变量x = NT1 5和变量y = NT1 5并输入x == y它将返回True
我还设法做到了这一点:
instance Show NT1 where
show (NT1 n) = show n
Run Code Online (Sandbox Code Playgroud)
whill显示x = NT1 5为5而不是NT1 5
在此之后,我应该能够做到这样的事情:
instance Ord NT1 where
(>) (NT1 x)(NT1 y) = (NT1 x) …Run Code Online (Sandbox Code Playgroud) 为了学习Haskell,我尝试改编康拉德·巴尔斯基(Conrad Barski)的名著《Land of Lisp》中的一些练习。这个想法是制作一个简单的文本游戏引擎。
具体我试过:
type Clau = String
type Descripcio = String
type Valors = [String]
-- NOTE : Ideas of types http://learnyouahaskell.com/making-our-own-types-and-typeclasses
data Lloc = Lloc String String String deriving (Show)
llocSituacio :: Lloc -> String
llocSituacio (Lloc situacio _ _ ) = situacio
llocDireccio :: Lloc -> String
llocDireccio (Lloc _ direccio _) = direccio
llocPas :: Lloc -> String
llocPas ( Lloc _ _ pas) = pas
nodes :: [(Clau,Descripcio)]
nodes = [("living-room","you are in the …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个通用的类似环形的东西,并将其应用于 Paul Hudak 在《哈斯克尔音乐学院》一书中描述的音乐数据结构。当然,有很多半群/幺半群的恶作剧被省略,但我有以下相关代码:
\nnewtype Duo a b = Duo {duo1 :: a} -- A ring-like structure\n\ndata Song a =\n Primitive a\n | Song a :+: Song a -- Composing Music Sequentially\n | Song a :=: Song a deriving Eq -- Composing Music Concurrently (in parallel)\n\ninstance Functor Song where\n fmap f (x :+: y) = fmap f x :+: fmap f y\n fmap f (x :=: y) = fmap f x :=: fmap f y\n fmap f …Run Code Online (Sandbox Code Playgroud) clojure ×5
haskell ×5
macros ×2
dictionary ×1
equality ×1
function ×1
identity ×1
lisp ×1
map-function ×1
maybe ×1
special-form ×1