为什么 Common Lisp 中的 lambda 之前使用#'?

2023-12-21

我想知道为什么我看到的大多数 Common Lisp 代码都有这样的内容

(mapcar #'(lambda (x) (* x x)) '(1 2 3))

而不是仅仅

(mapcar (lambda (x) (* x x)) '(1 2 3)),

这似乎也有效。我开始学习 Common Lisp,并且有一些 Scheme 背景,这引起了我的兴趣。

Edit:我知道您需要带有函数名称的 #',因为它们与变量位于不同的命名空间中。我的问题只是关于 lambda 之前的 #',因为 lambda 已经返回一个函数对象(我认为)。事实上,#'-less lambdas 由于宏扩展而起作用,这让它更有趣......


#'foo is an 缩写 http://www.lispworks.com/documentation/lw51/CLHS/Body/02_dhb.htm for (function foo)由读者。

在CL中,有几种不同的命名空间,#'foo or (function foo)将返回的功能值foo.

你可能想要搜索“Lisp-1 与 Lisp-2” https://www.startpage.com/do/metasearch.pl?query=Lisp-1%20vs.%20Lisp-2,检查其他堆栈溢出问题 https://stackoverflow.com/questions/1020968/separate-namespaces-for-functions-and-variables-in-common-lisp-versus-scheme,或阅读皮特曼和加布里埃尔的旧文章 http://www.dreamsongs.com/Separation.html为了更多地了解多个命名空间(也称为符号的单元)的概念。

原因是,在 lambda 的情况下,#'CL 中可以省略的是它是一个宏,因此扩展(取自超规格 http://www.lispworks.com/documentation/lw51/CLHS/Body/m_lambda.htm):

(lambda lambda-list [[declaration* | documentation]] form*)
==  (function (lambda lambda-list [[declaration* | documentation]] form*))
==  #'(lambda lambda-list [[declaration* | documentation]] form*)

#'由于历史原因可能仍会被使用(我认为在 Maclisplambdas 没有扩展到函数形式),或者因为有些人认为,用尖引号标记 lambda 可能会使代码更具可读性或连贯性。在某些特殊情况下,这可能会产生影响,但一般来说,您选择哪种形式并不重要。

我想你可以这样想:(function (lambda ...))返回函数(lambda ...)创造。注意lambda在 CL Hyperspec 中两者都有一个宏和一个符号条目 http://www.lispworks.com/documentation/HyperSpec/Body/a_lambda.htm。从后者来看:

lambda 表达式是一个列表,可以 用来代替函数名 某些上下文来表示函数 通过直接描述其行为 而不是间接地引用 已建立的函数的名称。

来自文档 http://clhs.lisp.se/Body/s_fn.htm of function:

如果 name 是 lambda 表达式,则 返回词法闭包。

我认为差异也与调用 lambda 形式有关,如下所示:((lambda ...) ...)它被视为要评估的形式,而不是(funcall #'(lambda ...) ...)。如果您想了解有关该主题的更多信息,可以阅读c.l.l 线程 http://groups.google.com/group/comp.lang.lisp/browse_thread/thread/e842449e3bac2555/07d63dde2c79d02f?#07d63dde2c79d02f关于它。

该线程的一些引用:

(lambda (x) ...其本身只是一些 不带引号的列表结构。是它的 外观作为参数 FUNCTION 特殊形式(function (lambda (x) ...这导致 函数对象存在

and:

更复杂的事实是 LAMBDA 宏是一个相当晚的 另外 ANSI Common Lisp,所以所有 真正的老家伙(即像我一样) 当你需要的时候学会他们的口齿不清 将 #' 提供给 lambda 表达式 在映射函数中。否则 不存在的 lambda 函数将 被调用。

宏的添加改变了这一点,但是 我们中的一些人太固执于自己的方式 想要改变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Common Lisp 中的 lambda 之前使用#'? 的相关文章

  • MOP:访问任何插槽定义? (mito柱型)

    我定义了一个使用 Mito ORM 的类 插槽定义了一个 col type isbn accessor isbn initarg isbn col type or varchar 128 null 如何获得 col type定义 由于这是我
  • (撰写)Common Lisp

    我们在 P Graham 的 ANSI Common Lisp 第 110 页 中找到了这个函数构建器来实现组合 参数是 n gt 0 带引号的函数名称 我不完全理解它 所以我将在这里引用代码并在下面指出我的问题 defun compose
  • SBCL:将 Hunchentoot 应用程序部署为可执行文件

    我开始使用 SBCL Common Lisp 并希望使用 Hunchentoot 开发一个小型 Web 应用程序 为了便于部署 我计划使用 sb ext save lisp and die 将所有内容保存在二进制文件中 因为我可以忍受大输出
  • common lisp:宏如何使用以编程方式生成的名称定义其他方法/宏?

    我意识到我的代码的某个部分由看起来相似的方法组组成 就像我有多个三重奏 一个由程序员的其他两个函数调用的辅助函数 我正在尝试编写一个宏来为我定义这三个函数 以便我所需要做的就是调用该宏 但我的尝试导致 defun 和函数调用将引用字符串而不
  • Common Lisp 案例和引用元素

    我正在用 CL 编写一个地下城爬行游戏 但在处理案例表单时遇到了问题 两件事情 Common Lisp 抱怨Duplicate keyform QUOTE in CASE statement make instance cl rogue t
  • 在lisp中,如何使用floor函数返回的第二个值?

    当我这样做时 4楼3 我得到了 1 1 3 但我该如何使用这 1 3 呢 例如 您可以使用将其绑定到变量multiple value bind multiple value bind quot rem floor 4 3 format t
  • 在 LISP 中实现基本库函数(手动)

    有什么方法可以定义函数my list my cons my append其执行类似的功能list cons and append分别 否则哪里可以找到这些功能的实现呢 Thanks 对于my list和my append 解决方案是 def
  • 在 LISP 中使用“ash”执行二分查找?

    所以 我现在正在阅读 Land of Lisp 事实证明 Lisp 与我见过的其他编程语言有很大不同 无论如何 本书提供了一些我们要输入到 CLISP REPL 中的代码 defparameter small 1 defparameter
  • Lisp 中的数组与列表:为什么下面的代码中的列表要快得多?

    我在解决时得到了意想不到的结果欧拉计划中的问题 75 https projecteuler net problem 75 我的代码确实找到了正确的解决方案 但它的行为很奇怪 我的解决方案包括遍历毕达哥拉斯树 巴宁矩阵 https en wi
  • 我应该在 Common Lisp 中使用哪些正则表达式库? [关闭]

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

    我想做的是 defgeneric fn x defmethod fn x integer 1 Positive integer defmethod fn x integer 1 Negative integer 我想要一个可以与任意类型说明
  • 在Emacs中,这个错误是什么意思? “警告:运行时需要 cl 包”

    我正在字节编译一个模块 它给了我这个警告 Warning cl package required at runtime 为什么这是一个警告 我很清楚我正在使用cl包裹 事实上有一个 require cl 模块中的语句 使用有什么问题吗cl
  • 在 Common Lisp 中编写 Lambda 表达式

    我目前正在阅读 Paul Graham 的 ANSI Common Lisp 并且有一个关于编写 lambda 表达式的问题 我们是否需要在 lambda 表达式前面加上前缀 如果我在 REPL 中写这样的东西 它会工作得很好 gt lam
  • 宏、Clojure 与 Common Lisp

    我和我的一些朋友正在开发一个新平台 我们想用 lisp 构建它 主要吸引力是宏 我们都使用 Common Lisp 但我想探索 Clojure 的选择 当我提出这一点时 其中一位说宏观体系 较弱 我想知道这是否属实 以及在哪些领域 就您可以
  • Common Lisp——为什么这个符号不是外部的?

    我正在尝试在 ASDF 中运行测试 如下所示 foo asd defsystem foo tests depends on foo fiveam components module tests components file main pe
  • 使用局部特殊变量

    为了方便原型设计 我依赖于许多全局变量 这些变量在整个代码中大量使用 但现在我想让其中一些成为本地的 但动态的 在本地声明它们是否有任何重大缺点 例如 效率等 special而不是全球 特殊变量不受欢迎的功能包括 缺乏参考透明度 这使得对代
  • 如何说服 Lisp SBCL 进行内联 Fixnum 算术?

    我在其他 SO 答案中找到了一些技术 但显然我无法说服 SBCL 进行内联修复数算术 declaim optimize speed 2 safety 1 declaim ftype function fixnum fixnum double
  • SLIME 和 SWANK 入门:Lisp 连接意外关闭:连接被远程对等点断开

    我试图使用 slime connect 函数通过 sbcl 访问远程服务器 我遵循了 slime mov 电影中的所有步骤马可 巴林格 http www guba com watch 30000548671但在为 slime 创建 ssh
  • 如何从 SBCL 解释器将特定函数写入文件?

    假设我在没有 SLIME 的情况下玩过 SBCL 没有任何简单的解释器 现在我想将几个函数保存在一个文件中 不是核心图像 只是文本形式的一些代码 我该怎么做呢 有两种方法可以做到这一点 使用DRIBBLE and or FUNCTION L
  • Common Lisp 反引号/反引号:如何使用?

    我在使用 Lisp 的反引号读取宏时遇到问题 每当我尝试编写一个似乎需要使用嵌入式反引号的宏时 例如 w x y 来自保罗 格雷厄姆的ANSI 通用 Lisp 第 399 页 我不知道如何以编译的方式编写代码 通常 我的代码会收到一整串错误

随机推荐