尝试调用未绑定的fn,但我已对其进行了定义

欧文(Erwin Rooijakkers)

我正在尝试将SICP的元循环评估器转换为Clojure。setup-environment调用extend-environment中无法编译,因为出现错误“尝试调用未绑定的fn”。这是代码的一部分:

(... loads of methods for creating and managing environment list)

(def primitive-procedures
  (list (list 'car first)
        (list 'cdr rest)
        (list 'cons conj) ;; TODO: reverse
        (list 'null? nil?)
        (list 'list list)
        (list '+ +)
        (list '- -)
        (list '* *)
        (list '/ /)
        ;;      more primitives
        ))

(def primitive-procedure-names 
  #(map [first
         primitive-procedures]))

(def primitive-procedure-objects 
  (fn [] (map (fn [p] (list 'primitive (second p)))
               primitive-procedures)))

(def the-empty-environment '())

(defn extend-environment [vars vals base-env]
  (if (= (count vars) (count vals))
    (conj base-env (make-frame vars vals))
    (if (< (count vars) (count vals))
      (throw (Throwable. "Too many arguments supplied") vars vals)
      (throw (Throwable. "Too few arguments supplied") vars vals))))

;; Added # in front here so it could be called (???)
(defn setup-environment []
  #(let [initial-env
         (extend-environment (primitive-procedure-names)
                             (primitive-procedure-objects)
                             the-empty-environment)] ;; <= that does not work
     (define-variable! 'true true initial-env)
     (define-variable! 'false false initial-env)
     initial-env)))

;; Method for interacting with the evaluator:

(defn driver-loop []
  (prompt-for-input input-prompt)
  (let [input (read)]
    (let [output (m-eval input the-global-environment)]
      (announce-output output-prompt)
      (user-print output)))
  (driver-loop))

(...)

(def the-global-environment (setup-environment))
(driver-loop)

当我评估该extend-environment方法时,出现以下错误:

  1. 由java.lang.IllegalStateException引起
    尝试调用未绑定的fn:
    #'scheme-evaluator / extend-environment
    Var.java:43 clojure.lang.Var $ Unbound / throwArity
    AFn.java:40 clojure.lang.AFn / invoke
    scheme- evaluator.clj:277 scheme-evaluator / eval7808

我想我没有提供正确类型的参数,或者我没有创建正确类型的函数。我尝试了匿名方法的各种变体,并在是否带括号的情况下进行了传递,但我无法对其进行编译。

有谁知道这个错误的原因是什么,我该如何解决?

亚瑟·乌尔费尔特

的定义

(def primitive-procedure-names 
  #(map [first
        primitive-procedures]))

可能不符合您的预期。如所写,这定义了一个不带任何参数的函数,并返回换能器(这是一个函数),如果将其应用于序列,则将分别用值0和1替代函数firstprimitive-procedures我将首先通过函数进行演示,然后通过数字值进行演示,以使发生的事情更加清楚(希望如此):

user> (into [] (map [first 'example]) [0 1])
[#function[clojure.core/first--4339] example]
user> (into [] (map [1 2]) [0 1])
[1 2]

也许你想要

(def primitive-procedure-names 
 (map first primitive-procedures))

defn除非您有充分的理由不建议,否则我建议使用定义函数的形式和定义值的def形式。

setup-environment是一个函数,它返回一个函数,如果您调用该函数,它将返回一个函数,该函数返回的初始环境未经调用define-variable修改。在Clojure中,集合类型是不可变的,因此,如果要对集合进行几次更改,则必须将添加第一个结果的结果链接到添加第二个结果的输入中,然后返回添加第二个结果的结果:

(add-second (add-first initial-value))

也可以这样写:

(-> initial-value
    add-first
    add-second)

这只是以上示例的简写形式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尚未找到功能SubmitSurvey的定义,但我对其进行了定义

我有一个代码,其中调用了Lateinit变量后对其进行了初始化,但我不知道如何

是否无法确定函数是否是生成器函数(如果已对.bind()进行了调用)?

一位同事已对我的承诺进行了承诺-怎么做?

测试是在R中的函数调用中使用默认参数还是对其进行了修改

FB朋友列表已对同一应用程序进行了身份验证

ThreadLocal.get()返回null,即使我之前对其进行了初始化

IllegalStateException:尝试在宏中调用未绑定的fn

Laravel在工厂播种但对其进行了扩展

尝试创建python程序,但使用def进行了简化

即使我在循环之外对其进行了初始化,Python 变量也会在每个循环中更新

在执行Shell脚本时,我创建了.txt文件,并在保存脚本退出后对其进行了编辑

(VSCode Mac)无法开始调试,是的,我已经对其进行了搜索,没有任何帮助

Tensorflowjs期望3个维度,即使我在Python中使用2个对其进行了训练

Laravel模型属性在我保存时为空,但已在构造函数中对其进行了验证

Boolean 尚未初始化,但是,我在代码中早些时候对其进行了初始化

是否对JavaScript引擎尾部调用(TCO)进行了优化?

错误:nodejs中的getaddrinfo ENOTFOUND进行了get调用

如何找出JVM对我的代码进行了哪些优化?

git:合并之前我进行了什么提交?

我在android studio中进行了测验,我只想显示15个问题,但我总共有100个问题?我有SQLite,但我不明白它是如何工作的

如果为RxJava主题进行了onComplete调用,我是否需要再次手动退订?

我正在使用var创建对象,因为我对其进行了突变,但得到警告:“变量'variableName'从未发生突变,请考虑...”

RealmSwift错误:“ RLMException,原因:对集合进行枚举时对其进行了更改。”

R:如何以1/10的成功率反复模拟成功之前进行了多少次尝试?(并记录进行了多少次尝试?)

我无法连接3个表,其中一个表对其列进行了两次连接

Clojure,试图调用未绑定的 fn

如果在Kotlin中对其进行了修改,则无法删除可变集中的元素

当我已经为另一个函数进行了计算时,为什么不能将这些计算调用到我的构建中