相关疑难解决方法(0)

为什么eval邪恶呢?

我知道Lisp和Scheme程序员通常会说eval除非必要,否则应该避免.我已经看到了几种编程语言的相同建议,但我还没有看到一个反对使用的明确论据列表eval.我在哪里可以找到使用中潜在问题的说明eval

例如,我知道GOTO程序编程中的问题(使程序难以理解且难以维护,难以找到安全问题等),但我从未见过反对的论点eval.

有趣的GOTO是,相反的论点应该对延续有效,但我看到Schemers,例如,不会说延续是"邪恶的" - 你在使用时应该小心.他们更倾向于使用代码而eval不是代码使用continuation(据我所知 - 我可能是错的).

lisp scheme eval clojure common-lisp

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

在Clojure中执行动态绑定函数

我想在数据结构中预先存储一堆函数调用,然后在另一个函数中评估/执行它们.

这对于在命名空间级别定义的函数按计划工作defn(即使函数定义在我创建数据结构之后),但不适用于函数定义的函数let [name (fnletfn函数内部的函数.

这是我的小型自包含示例:

(def todoA '(funcA))
(def todoB '(funcB))
(def todoC '(funcC))
(def todoD '(funcD)) ; unused

(defn funcA [] (println "hello funcA!"))

(declare funcB funcC)

(defn runit []
    (let [funcB (fn [] (println "hello funcB"))]
    (letfn [(funcC [] (println "hello funcC!"))]
        (funcA)       ; OK
        (eval todoA)  ; OK
        (funcB)       ; OK
        (eval todoB)  ; "Unable to resolve symbol: funcB in this context" at line 2
        (funcC)       ; OK
        (eval todoC)  ; …
Run Code Online (Sandbox Code Playgroud)

binding eval clojure

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

哈希映射的Clojure DRY模式?

我在let块中做了很多计算,返回包含数据的哈希映射.以下是一个不那么简单的例子:

(def ground-truth
(let [n              201
      t1             2.0
      linspace       (fn [a b n] (let [d (/ (- b a) (dec n))]
                                   (map (fn [x] (+ a (* x d))) (range n))))
      times          (vec (linspace 0.0, t1, n))
      wavelength     1
      wavespeed      1
      f              (* (/ wavespeed wavelength) 2 Math/PI)
      dt             (- (get times 1) (get times 0))
      amplitude      5.0
      ground-level   10.0
      h-true         (mapv #(+ ground-level 
                               (* amplitude (Math/sin (* f %))))
                           times)
      h-dot-true     (mapv #(* amplitude f (Math/cos (* …
Run Code Online (Sandbox Code Playgroud)

dry clojure

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

如何从 Clojure 中的字符串获取变量的值?

我在 clojure 中做了一个小项目,我想知道是否有这样的东西:

(let [myvar "hello"] (println (read-var "myvar")))
Run Code Online (Sandbox Code Playgroud)

其中“read-var”函数发现有一个名称作为字符串传递的变量并返回它的值。

我发现了这个load-string函数,但它似乎不适用于 let 绑定。

谢谢!

clojure

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

标签 统计

clojure ×4

eval ×2

binding ×1

common-lisp ×1

dry ×1

lisp ×1

scheme ×1