gpt4 book ai didi

带类型提示的动态函数

转载 作者:行者123 更新时间:2023-12-02 18:12:03 24 4
gpt4 key购买 nike

我正在尝试在运行时生成带有提示参数的函数。

参数符号在运行时是已知的。

如果我提前知道它们,我可以像这样动态创建函数:

(def foo 
(eval
(list 'fn '[^String a] (list '.length 'a))))

具有所需的性能:

user=> (time (reduce + (map foo (repeat 1000000 "asdf")  )))
"Elapsed time: 164.578 msecs"
4000000

相对于:

(def bar
(eval
(list 'fn '[a] (list '.length 'a))))

user=> (time (reduce + (map bar (repeat 1000000 "asdf") )))
"Elapsed time: 2392.271 msecs"
4000000
现在。我遇到的问题是如何在运行时使用动态参数列表创建此类函数。例如:

(def baz
(let [args '[a b]]
(eval
(list
'fn
(vec (flatten (map (fn [ar] `[^String ~ar]) args)))
(list '.length (first args))))))
#'user/baz

user=> (time (reduce + (map baz (repeat 1000000 "asdf") (repeat 1000000 "asdf"))))
"Elapsed time: 2467.178 msecs"
4000000

看起来语法引用阻止编译器或读取器宏解释类型提示。如何通过类型提示实现动态函数生成?

附注我知道这样的函数创建看起来很疯狂,并且有人可能建议使用宏而不是 eval,但我有充分的理由这样做。

P.P.S 除了使用特殊形式“fn”和 eval 之外,还有其他方法可以使用运行时已知的参数创建 lambda 吗?

最佳答案

如果你坚持:

(defn bazy [arglist]
(let [args (mapv #(with-meta (symbol %) {:tag 'String}) arglist)]
(eval (list 'fn args (list '.length (first arglist))))))

(def baz (bazy '[a b]))

关于带类型提示的动态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18193124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com