为什么在 emacs-lisp 中的函数参数之前使用#'?

2024-05-12

我熟悉 Emacs Lisp,但不熟悉 Common(或任何其他)Lisp。一些 Lisp 程序员建议(例如emacs 的基本功能 https://stackoverflow.com/questions/17076646/a-basic-function-for-emacs/17078405?noredirect=1#comment27008144_17078405)这很好用#'Lisp 代码中函数参数的前面。例如:

(mapc #'my-fun '(1 2 3))

在 Emacs Lisp 中,我相信这相当于

(mapc 'my-fun '(1 2 3))

来自 elisp 手册,第 12.7 节。

读取语法#'是使用的简写function。这 以下形式都是等效的:

 (lambda (x) (* x x))
 (function (lambda (x) (* x x)))
 #'(lambda (x) (* x x))

以及对的帮助function

函数是一种特殊形式eval.c.

(function ARG)

Like quote,但对于函数对象来说是首选。以字节为单位 汇编,function导致其参数被编译。quote不可以这样做。

所以这似乎是一个潜在的优化,但仅此而已。此外,由于具有 ML/Haskell 背景,以不同于任何其他数据的方式对待函数似乎很奇怪。

问题:

你同意吗#'应该用在emacs-lisp函数参数? (简要解释一下为什么 Common Lisp 需要它们也很好。)

Notes:

我认为当#'被省略(值与函数)。但 这似乎是错误的,因为文档function没有说任何关于抓取功能单元的内容。这是通过使用实现的symbol-function.

相关问题有

  • Common Lisp 中的 #' https://stackoverflow.com/questions/14021965/the-in-common-lisp
  • 在 Common Lisp 中编写 Lambda 表达式 https://stackoverflow.com/questions/13213611/writing-lambda-expressions-in-common-lisp
  • 为什么 Common Lisp 中的 lambda 之前使用#'? https://stackoverflow.com/questions/3325499/why-is-used-before-lambda-in-common-lisp/3325572#3325572

但他们似乎建议#'至少在 lambda 中是不必要的。


中的引号字符#'foo与其中的一个无关'foo.

#'foo被替换为阅读时间 by (function foo)。当编译并执行时,它会查找功能定义命名为foo (by defun, flet, labels或类似)。

'foo被替换为阅读时间 by (quote foo)。当它被编译和执行时,它只是被符号替换foo.

Funcall and apply(因此通常是高阶函数)功能指示符作为参数。 A功能指示符可以是函数或命名函数的符号,因此两者#'foo and 'foo是功能指示符。

因此,表格'foo and #'foo乍一看似乎可以互换。然而,实际函数的查找是在不同时间完成的——#'foo在调用它的地方查找,而由'foo只有在最终应用时才会被查找。

如果多次使用函数指示符,则仅进行一次查找甚至仅在编译时进行查找会更有效。这确实可以节省大量时间,并转化为编辑器中更流畅的用户体验。

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

为什么在 emacs-lisp 中的函数参数之前使用#'? 的相关文章

  • 如何使用 Emacs Lisp 检查文件是否存在?

    我希望 emacs 将打开时生成的文件标记为只读 我所缺少的难题部分是如何检查文件是否 存在 我目前有以下内容 get file extension defun get ext file name car cdr split string
  • Lisp:使用语法糖访问递归哈希

    我正在尝试构建一个函数 或宏 来简化哈希表深处数据的获取和设置 也就是说 哈希中的哈希 哈希中的哈希等 我不认为我可以用宏来做到这一点 而且我不知道如何用 eval 来做到这一点 我希望能够执行以下操作 gethashdeep HEROES
  • 如何在 (emacs) shell 命令的输出中添加颜色?

    执行命令时shell命令 关联缓冲区中显示的输出未着色 当从 emacs 中调用测试框架 输出黄色 绿色 红色 时 这尤其令人烦恼 我如何配置或扩展 emacs 以便shell命令允许在 shell 中进行彩色输出并在表示该输出时保留颜色
  • 为什么 clojure-mode 用一些卷曲的 f 字符替换 fn ?

    我刚刚开始使用 emacs 入门套件和 clojure 模式 现在 当我输入或粘贴 fn 在 Clojure 模式下进入缓冲区 fn 字符在窗口中被替换为稍微卷曲的小写字母 f 缓冲区已正确保存 但这非常烦人 尤其是当我以艰难的方式发现该功
  • setf中的f代表什么?

    LISP 有setf函数给变量赋值 现在我一直想知道该函数的名称 Theset部分是显而易见的 但是什么是f后缀代表 F的实际含义经常被忘记 根据一些消息来源 f 后缀可以代表 字段 例如参见这个answer https stackover
  • 在 emacs 的文件中不断出现的这些 ^M 是什么?

    我认为这可能与 TextMate 有关 但我们在一个小团队中工作 并且在 git 中几乎相同的文件的全文件冲突方面遇到了一些问题 在一个分支中 文件的每一行都附加了 M 这是什么神秘的事 M角色应该做什么 它从哪里来 我们的开发人员在 Wi
  • 字节编译宏时出现“返回的值未使用”警告

    为什么对以下内容进行字节编译会产生警告 defmacro foomacro shiftcode defun foo optional arg interactive concat shiftcode p message arg is i a
  • 如何更改 ESS 中的智能分配键(“_”到“<-”)绑定

    在 emacs ESS 中 如何正确更改 ess smart S assign 的键绑定 我尝试的是添加 custom set variables ess smart S assign key to my emacs 但这让奇怪的事情发生了
  • 如何在 Emacs à la Vim 中设置标记?

    I d like to be able to set multiple marks in Emacs like Vim does In Vim you might press m b and that would set a mark at
  • 设置自动完成以处理语义

    我在 Emacs 中的自动完成包方面遇到问题 目前我已经启动并运行了 cedet 并具有适当的自动完成功能 但自动完成包有一些奇怪的行为 它不会使用语义 参议员 的数据库 直到我显式访问包含文件并创建 C u M x bovinate 然后
  • cygwin bash 在 emacs shell 中无法正确显示

    我正在尝试使用 emacs 来运行 cygwin 我的环境是Windows 7 x64 emacs 24 0 93 1 cygwin 2 769 系统编码为gbk cygwin的编码系统默认为utf 8 emacs的编码系统默认为gbk I
  • Emacs cperl - 常量块中的缩进

    我正在运行基于 GNU Emacs 24 3 50 2 的 Aquamacs 3 0a cperl 版本是 6 2 当我编辑 Perl 常量块时 我得到了我不想要的额外缩进 use constant ONE gt 1 TWO gt 2 TH
  • Scheme 和 Common Lisp 之间的实际区别是什么? (或任何其他两种 Lisp 方言)

    注意 我并不是在问学哪个 哪个更好或者诸如此类的问题 我选择了 SICP 的免费版本 因为我觉得它读起来很好 我听说过有关它的好东西 并且我对编程的这一方面很感兴趣 我知道Scheme 是Lisp 的一种方言 我想知道 Scheme 和Co
  • 如何清空或清除 emacs 迷你缓冲区?

    有时 迷你缓冲区的内容会显示命令的输出 emacs 24 当输出只有一行时 这并不会造成太大的不便 当命令有多行长并且迷你缓冲区使用许多可用于其他用途的显示行时 这会更烦人 有没有办法清除迷你缓冲区的内容 注意 当我M echo usage
  • 如何指定 sbcl(或 common lisp)向量中的元素类型?

    我尝试在 sbcl 1 1 14 中执行以下代码 但类型检查似乎忽略了向量元素的声明 defun test vec declare type vector integer vec format nil a elt vec 0 有什么提示吗
  • 如何在 Emacs 中保存所有文件(或保存所有缓冲区)?

    C x C s saves only the current buffer 如何保存所有文件 或所有缓冲区 Press C x s and then choose for saving all buffers
  • 在 Emacs 中追逐标签后切换到原始缓冲区

    I use M 跳转到类 函数的定义 有时有多个类具有相同的标签 所以我需要使用C u M 跳转到多个文件 因此有多个缓冲区 现在我的问题是 如何快速回到原来的缓冲区 我知道C x b 但是您需要输入缓冲区名称 或者它只是默认为您提供您访问
  • 组织模式下的内联代码

    Markdown 允许embedded code 这怎么能在org mode 我了解源代码块 begin example blah blah end example 但我想要的是这样的 显然 具有正确的语法 我不知道 This is emb
  • Emacs 如何确定要撤消的工作单元

    When you enter the command C Emacs undoes some part of your recent changes to a buffer When you enter C again it undoes
  • Shift 键在我的 emacs 中不起作用

    I run emacs in gnome terminal with nw option it works well except for some key shortcuts that include the shift key For

随机推荐