let* 和 set 之间的区别?在 Common Lisp 中

2024-04-10

我正在从事一个基因编程爱好项目。

我有一个函数/宏设置,当以 setq/setf 形式评估时,将生成一个如下所示的列表。

(setq trees (make-trees 2)) 
==> (+ x (abs x))

然后它将绑定到 lambda 函数#<FUNCTION :LAMBDA (X) ... >通过战略性地使用函数/宏

但是,我希望比手动分配变量更有效,所以我写了这样的内容:

(setq sample 
      (let* ((trees (make-trees 2))
         (tree-bindings (bind-trees trees))
         (evaluated-trees (eval-fitness tree-bindings))))
      (list (trees tree-bindings evaluated-trees)))

但是,我得到EVAL: trees has no value当我把它放在 let 表单中时。我的怀疑是,与 SETF 相比,LET 中的宏扩展没有得到充分执行,但这对我来说没有意义。

造成这个问题的原因是什么?

--- 编辑:拉出我的代码并将整个文件放入粘贴箱中 ---

假设我决定 setq 不会为我做这件事,并且我编写了一个简单的函数来完成它:

(defun 生成样本 () (让 ((twiggs (make-trees 2))) (让((树绑定(绑定树twiggs))) (让((评估树(评估健身树绑定)))
(列出 twiggs 树绑定评估树)))))

这会产生大量...帮助文件错误消息(??!?)...和“eval:变量 twiggs 没有值”,这源于 SLIME 检查上的绑定树定义。

我相当确定我已经完全清理了我的宏。http://pastebin.org/673619 http://pastebin.org/673619


(Setq make-trees 2)设置变量的值make-trees为 2,然后返回 2。

在你所描述的内容中我没有看到宏的原因。你的情况是真的吗make-trees创建一个随机树,它可以被解释为一个程序?只需将其定义为一个函数即可defun。我在想这样的事情:

(defun make-tree (node-number)
  (if (= node-number 1)
      (make-leaf)
      (cons (get-random-operator)
            (mapcar #'make-tree
                    (random-partition (- node-number 1)))))) 

Let and setq做完全不同的事情。Setq为现有变量赋值,而let创建一个带有多个词法绑定的新词法作用域。

我认为你应该展示更多你的代码;目前,你的问题没有多大意义。


Update:

我将修复您的代码片段的缩进以使事情更清晰:

(setq sample 
      (let* ((trees (make-trees 2))
             (tree-bindings (bind-trees trees))
             (evaluated-trees (eval-fitness tree-bindings))))
      (list (trees tree-bindings evaluated-trees)))

现在,正如之前所写,let*建立词汇绑定。这些 仅在其主体范围内:

(setq sample 
      (let* ((trees (make-trees 2))
             (tree-bindings (bind-trees trees))
             (evaluated-trees (eval-fitness tree-bindings)))
        ;; here trees, tree-bindings, and evaluated-trees are bound
        ) ; end of let* body
      ;; here trees, tree-bindings, and evaluated trees are not in scope anymore
      (list (trees tree-bindings evaluated-trees)))

最后一行也是虚假的。如果这些名字被绑定的话 返回一个包含一个元素的列表,这将是评估的结果 功能trees with tree-bindings and evaluated-trees作为 论据。

你可能会得到你想要的东西,如下所示:

(setq sample 
      (let* ((trees (make-trees 2))
             (tree-bindings (bind-trees trees))
             (evaluated-trees (eval-fitness tree-bindings)))
        (list trees tree-bindings evaluated-trees)))

另一个更新:

宏的目的是在函数无法消除重复代码时消除重复代码。一种常见的应用是在处理位置时,您还需要它们来定义新的控制结构。只要您没有发现某些东西不能作为函数工作,就不要对其使用宏。

以下是一些可能对您有帮助的代码:

(defun make-tree-lambda (depth)
  (list 'lambda '(x)
        (new-tree depth)))

(defun make-tree-function (lambda-tree)
  (eval lambda-tree))

(defun eval-fitness (lambda-form-list input-output-list)
  "Determines how well the lambda forms approach the wanted function
by comparing their output with the wanted output in the supplied test
cases.  Returns a list of mean quadratic error sums."
  (mapcar (lambda (lambda-form)
            (let* ((actual-results (mapcar (make-tree-function lambda-form)
                                           (mapcar #'first input-output-list)))
                   (differences (mapcar #'-
                                        actual-results
                                        (mapcar #'second input-output-list)))
                   (squared-differences (mapcar #'square
                                                differences)))
              (/ (reduce #'+ squared-differences)
                 (length squared-differences))))
          lambda-form-list))

(defun tree-fitness (tree-list input-output-list)
  "Creates a list of lists, each inner list is (tree fitness). Input
is a list of trees, and a list of test cases."
  (mapcar (lambda (tree fitness)
            (list tree fitness))
          tree-list
          (eval-fitness (mapcar #'make-tree-lambda tree-list)
                        input-output-list)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

let* 和 set 之间的区别?在 Common Lisp 中 的相关文章

  • 如何在宏中允许可选的尾随逗号?

    这是我想要的综合示例 macro rules define enum Name ident Variant ident gt pub enum Name None Variant define enum Foo A B 这段代码可以编译 但
  • 如何在 emacs 中自动回答是或否

    I binded function semantic symref to key C c C r like this global set key kbd C c C r semantic symref everytime I presse
  • 如何使用语法检查变量的度量(名义/序数/规模)?

    我想使用语法找到变量的度量 然后在 If 语句中使用它 使用语法可以吗 例如 如果我有两个变量a 标称 和b 序数 DO IF a is nominal END IF 您可以创建数据中所有名义变量的列表 在以下示例中 列表将存储在宏调用下
  • 设置、让、宏、坚果

    我正在尝试从 html 内容构建一个快速目录 为了简短起见 代码非常简单 defn toc content doseq i take 5 iterate inc 1 let h str h i println content h where
  • XCode iPhone 项目中目标所有配置的通用预处理器宏

    我的应用程序的每个目标通常有四种配置 调试 发布 分发 临时 有没有办法为所有 4 个添加一个通用宏 同时不破坏我到目前为止设置的宏 您在编辑器中看到 多个值 提前致谢 奥比旺 在前缀头文件中定义宏 将包含在所有源文件中
  • 如何有条件地更改 Rust 宏的一小部分?

    我正在建造一个具有以下功能的板条箱foo 这个箱子有一个宏bar 根据是否做细微不同的事情foo is set 我可以复制整个宏 cfg feature foo macro rules bar Lots of rules A gt B cf
  • 函数式语言与语言实现的角度有何不同

    出现了全新的 函数式编程 范式 与过程式编程相比 它需要彻底改变思维模式 它使用高阶函数 纯度 单子等 我们通常在命令式和面向对象语言中不会看到这些 我的问题是如何执行这些语言与命令式或面向对象语言的不同之处在于 例如内存管理或指针等内部结
  • Julia 中基准和时间宏的区别

    我最近发现两个宏之间存在巨大差异 benchmark 和 time 在内存分配信息和时间方面 例如 benchmark quadgk x gt x 0 1 BenchmarkTools Trial memory estimate 560 b
  • Clojure 中的快速素数生成

    我一直在努力解决欧拉计划 https projecteuler netClojure 中的问题得到了改善 我已经遇到过几次素数生成问题 我的问题是它花费的时间太长了 我希望有人能帮助我找到一种有效的方法 以 Clojure 的方式做到这一点
  • 关于onlisp中的广义变量

    我不确定这里发生了什么 文中的宏观示例 基本上不知道如何使用get setf 方法 一个内置宏 也许是函数 具体来说 如果某些返回值是这样的情况呢 get setf 方法为零 例如 get setf 方法 x NIL NIL NEW 306
  • 如何在 Lisp 中生成一系列佩尔数而不是特定的数

    如何使用 cons 或其他方式打印列表佩尔数 https en wikipedia org wiki Pell number直到第N个数 defun pellse k if or zerop k k 1 k 2 pellse k 1 pel
  • 最好的 AutoHotKey 宏? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • laravel 5 中 HTML 宏应该放在哪里?

    在 laravel 4 中 我曾经在多个视图中使用 HTML 宏 例如 HTML macro minipics function pic 为此我有一个macros php文件在 app文件夹 我找不到在 laravel 5 中放置宏的位置
  • 我如何访问 Common lisp 中 Defclass 插槽的 :Documentation 字符串

    好的 这是我如何实例化 Defclass 以及相关的 Defmethod 和 Defparameter defvar account numbers 0 defclass bank account customer name initarg
  • 如何指定 sbcl(或 common lisp)向量中的元素类型?

    我尝试在 sbcl 1 1 14 中执行以下代码 但类型检查似乎忽略了向量元素的声明 defun test vec declare type vector integer vec format nil a elt vec 0 有什么提示吗
  • LISP 非常简单的列表问题

    我正在学习 lisp 而且我对此还很陌生 所以我想知道 如果我这样做 defparameter list 1 list 1 2 defparameter list 2 list 2 3 defparameter list 3 append
  • C++ 编译时类型注册技巧

    我有以下情况 假设我有一堆类型 函子 我想在编译期间注册 编译它们 最好是像 boost mpl vector 这样的东西 你知道有什么技巧可以做得很好吗 我的愿望是拥有实现函子类型和注册文件的 hpp 文件 其中宏将类型引入编译中 例如
  • Clojure 中的宏和函数

    我在这个 Clojure 教程中读到了以下行 http java ociweb com mark clojure article html Macros http java ociweb com mark clojure article h
  • 一次性的 lisp 宏,我的实现正确吗?

    我正在尝试从 Peter Seibel 的书 Practical Common Lisp 中学习 Lisp 在第 8 章 宏 定义你自己的 http www gigamonkeys com book macros defining your
  • 对C宏扩展和整数运算感到困惑[重复]

    这个问题在这里已经有答案了 可能的重复 一个谜语 C https stackoverflow com questions 5611724 a riddle in c 我对以下代码片段有几个问题 include

随机推荐