在 emacs 中,cl-flet 和 cl-letf 有什么区别?

2023-11-23

据我了解,两者都是用来临时改变函数的值。超越事实cl-flet是一个函数并且cl-letf是宏,什么时候使用它们?


绑定可以是递归的

如果函数定义用名字称呼自己,哪个函数会被调用? (比较cl-flet vs cl-labels行为)。

范围是词汇上的......将它们捕获在闭包中......

了解词法绑定/范围与动态绑定/范围。

cl-letf可以用来设置动态绑定函数值,通过使用 PLACE(symbol-function 'FUNC)对于一些功能。这类似于已弃用的flet.

不过,可以指定任何受支持的地点——cl-letf isn't only用于函数绑定。

你什么时候使用它们?

当您想要临时定义(或覆盖)函数时。任何给定用例所需的范围规则将决定您将使用哪个选项。


  • (cl-flet ((FUNC ARGLIST BODY...) ...) FORM...)

    FUNC 仅对 FORM 中的代码可见。

  • (cl-labels ((FUNC ARGLIST BODY...) ...) FORM...)

    FUNC 对 FORM 中的代码以及 FUNC 自己的 BODY 中的代码都是可见的。

  • (cl-letf (((symbol-function 'FUNC) VALUE) ...) BODY...)

    在 BODY 完成评估之前,FUNC 对所有事物都是可见的。


一些(相当人为的)例子......

在第一个示例中,我们定义的临时函数是递归的 -- it 称自己为——因此我们使用cl-labels:

(注意,这不是一个强大的阶乘实现;它仅用于演示目的。)

(defun my-factorial (number)
  "Show the factorial of the argument."
  (interactive "nFactorial of: ")
  (cl-labels ((factorial (n) (if (eq n 1)
                                 1
                               (* n (factorial (1- n))))))
    (message "Factorial of %d is %d" number (factorial number))))

如果你改变cl-labels to cl-flet一旦内部你就会得到一个错误(factorial (1- n))被评估,因为within我们的临时功能,没有功能factorial是已知的。

如果你要定义一个全局的factorial无条件返回值的函数1:

(defun factorial (n) 1)

然后factorial函数定义为cl-flet等着瞧that当它调用时factorial, and my-factorial会计算(* n 1)作为任何参数的值n.

当不需要递归时,cl-flet很好用:

(defun my-square (number)
  "Show the square of the argument."
  (interactive "nSquare of: ")
  (cl-flet ((square (n) (* n n)))
    (message "Square of %d is %d" number (square number))))

Both cl-labels and cl-flet提供词法作用域的函数,可见only到这些宏调用体内编写的代码;特别是not到我们可能的任何其他函数的代码calling.

如果您正在定义一个辅助函数,例如上面的示例,那么词法作用域可能就是您想要的,因为您很有可能只会在宏体内调用辅助函数。

如果你想暂时override一个现有的函数,但是,您很有可能需要您正在调用的函数来查看覆盖。在这种情况下,您需要覆盖才能具有动态范围。

在过去flet是为临时函数提供动态作用域的方法,但是flet现在已弃用,转而使用cl-letf与一个“地方”(symbol-function 'FUNC)

在以下示例中,乘法函数被重写,动态作用域意味着my-square and my-factorial将看到并使用我们对乘法的临时定义。

(defun my-bad-square ()
  "Maths gone wrong."
  (interactive)
  (cl-letf (((symbol-function '*) '+))
    (call-interactively 'my-square)))
(defun my-bad-factorial ()
  "More maths gone wrong."
  (interactive)
  (cl-letf (((symbol-function '*)
             (lambda (x y) (- x y))))
    (call-interactively 'my-factorial)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 emacs 中,cl-flet 和 cl-letf 有什么区别? 的相关文章

  • 带有 Viper 和 Vimpulse 的 Emacs 缺少哪些 Vim 功能?

    Emacs 的一些重要功能在 Vim 中是缺失的 例如 comint 模式 并且没有脚本 插件可以替代它们 与 Emacs 相比 Vim 也有一些优点 例如模式编辑和通常更好的默认快捷键 然而 Viper 模式让我两者兼而有之 Vimpul
  • 设置 Emacs 进行 Erlang 编程

    Emacs 是 Erlang 编程的首选 IDE 有很多好的模式 distel erlware mode 默认的 erlang 模式 但是您对设置 Emacs 进行专业 Erlang 开发有何建议 按照中所述设置 erlang mode自述
  • Windows、Emacs、Git Bash 和 shell 命令

    Windows 7 Emacs 24 3 1 git 1 8 1 msysgit 1 我的等效 emacs 文件中有以下内容 if equal system type windows nt progn setq explicit shell
  • emacs 临时文件的 .gitignore 正则表达式

    我正在尝试 gitignore emacs 临时 自动保存文件 我在用着 在我的 gitignore 中 But git add A在子文件夹中运行仍然给我 new file make collections py new file nor
  • 将字符定义为单词边界

    我已经定义了 字符在乳胶模式下充当单词组成部分 我对结果非常满意 唯一困扰我的是像这样的序列 alpha beta被视为单个单词 当然 这是预期的行为 有没有办法让 emacs 将特定字符解释为单词 starter 这样 它将始终被视为其后
  • 在 Emacs 中,如何确定哪个包正在加载 Tramp?

    我与 ranp 和 cygwin mount 有一个奇怪的交互 我认为 Emacs 文件名的制表符补全会附加一个额外的 i cygwin https stackoverflow com questions 1705802 emacs tab
  • C# 开发人员有什么理由应该学习 Emacs/Vim 吗?

    我在一家纯粹的 Microsoft 商店担任 C 开发人员 最近 我开始在工作之余的空闲时间使用 Gas 和 Linux 自学汇编 我喜欢摆弄 Linux 尽管我对它还很陌生 我一直听说我应该学习 VIM 或 Emacs 但事实是 我绝对不
  • Emacs 在多个文件中查找并替换正则表达式 (find-name-dired + Q),不保存我的缓冲区?

    我不明白这是怎么回事 我已经在整个目录中进行了搜索和替换 使用 M x 查找名称 dired RET 选择我的项目的根目录 输入 rb 作为要匹配的文件名 按 t 选择找到的所有文件 按 Q shift Q 开始搜索 替换 输入 交易 作为
  • 在多个 emacs 缓冲区上执行特定命令

    有没有办法在多个缓冲区上执行 emacs 命令 而不必单独选择它们并在每个单独的缓冲区上执行它 我通常打开与特定正则表达式匹配的多个文件 例如 py并希望启用特定模式 例如hs minor mode or glasses mode在每个上
  • 在 Emacs 中,如何更改迷你缓冲区完成列表窗口?

    我想为迷你缓冲区完成列表设置一个特定的窗口 目前 我有 3 个窗口采用此配置 在这种情况下 我想使用左下窗口作为迷你缓冲区完成列表 目前 它似乎是随机的一个窗口 大多数时候它喜欢使用最右边的窗口 它太薄了 无法在我不必水平滚动的情况下显示完
  • Mac OS High Sierra 下无法打开 pty

    我的问题的本质是 用户程序如何在 Mac OS High Sierra 上打开 pty 例如 dev ptyp0 设备名称的标准 open 似乎不起作用 尽管它的保护是 crw rw rw 上下文是在 Mac OS 下运行 Emacs 在
  • 基于扩展的 Emacs auto-minor-mode

    I found 这个问题 https stackoverflow com questions 1299193 in emacs how to automatically enable a minor mode based on buffer
  • 如何在Emacs Lisp中脱离maphash?

    我需要提前退出maphash当我找到我要找的东西时 defun find in hash str hash let match nil maphash lambda key value if string prefix p str key
  • 要求 Emacs 更清楚地突出显示哪个窗口(窗格)具有焦点(光标)

    假设我将 Emacs 窗口分成多个图块 例如 When I switch between tiles aka windows in Emacs to edit my files e g using C x o I can see on wh
  • 如何在组织模式下关闭公司模式?

    我正在使用 spacemacs 并尝试在组织模式下关闭公司模式 同时将其保留在其他主要模式中 我尝试过以下方法 global company mode not org mode 但它不起作用 禁用自org mode hook 此方法几乎适用
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • Emacs 和 Anaconda。链接问题

    我有一个问题 为了运行Anaconda https store continuum io cshop anaconda 我需要unset LD LIBRARY PATH 为了运行 Emacs 以及其他程序 我需要set LD LIBRARY
  • Emacs cperl - 常量块中的缩进

    我正在运行基于 GNU Emacs 24 3 50 2 的 Aquamacs 3 0a cperl 版本是 6 2 当我编辑 Perl 常量块时 我得到了我不想要的额外缩进 use constant ONE gt 1 TWO gt 2 TH
  • Lisp:CHAR 既未声明也未绑定

    几天前我决定学习 通用 Lisp 我意识到这是一个相当新手的问题 对于至少有一点经验的人来说可能非常微不足道 所以基本上发生的事情是我加载 Emacs Slime 通过 Lisp in a Box 并编写我的程序 包括在下面 defun l
  • 如何从 Emacs 中检出 Perforce 下的文件?

    我在工作中使用 Perforce 进行源代码控制 并且希望从 Emacs 中 打开以进行编辑 源代码控制下的文件 那怎么办呢 我需要在 Emacs 中设置什么 有插件吗 我还想执行其他 p4 操作 例如提交我的更改等 Perforce Em

随机推荐

  • 枚举中的方法[重复]

    这个问题在这里已经有答案了 所以我对 Java 枚举是否可以有函数感到困惑 我正在制作一个简单的 html 编辑器 并想使用枚举来表示 html 标签 是的 我知道这不是最好的方法 但这是我的团队决定实现它的方式 所以我一直在尝试做这样的事
  • WAIT 和 BLOCKED 线程状态之间的区别

    线程状态 WAIT 和线程状态 BLOCKED 有什么区别 The Thread State 文档 Blocked等待监视器锁而被阻塞的线程就处于这种状态 Waiting无限期等待另一个线程执行特定操作的线程处于此状态 没有向我解释其中的差
  • 仅使用 HTML/JavaScript 创建购物车

    我不知道该怎么做才能完成这个项目 我需要创建一个仅使用一个 HTML 页面的购物车 我已经设置了表格来显示正在出售的商品 但我迷失的是 JavaScript 我不知道如何将 添加到购物车 按钮与所有必要的数据 名称 描述和价格 链接起来 以
  • 有没有办法将数字四舍五入为读者友好的格式? (例如 1100 美元)[已关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 就像 Stack Overflow 声誉四舍五入一样 我希望对货币做同样的事情 1 000 美元 gt 1 000 美元 1 000 000 美元 gt 100 万美元 我如何在 J
  • 初始化后设置TinyMCE编辑器参数

    我正在尝试设置readonlytinyMCE 中的参数为true在tinyMCE初始化之后 如果帖子已经发布 我尝试将其与 WordPress 一起使用来禁用帖子编辑器 我发现一些消息来源声称您可以致电 tinyMCE activeEdit
  • 使用 setTimeout 调用方法的自定义对象失去范围

    我在构建 Javascript 对象并使用 setTimeout 调用该对象内的方法时遇到问题 我尝试了各种解决方法 但在循环的第二部分中 范围总是成为窗口对象而不是我的自定义对象 警告 我对 javascript 还很陌生 my code
  • 在 django-crispy-forms 中使用字段标签作为占位符

    我正在考虑使用字段标签作为我的占位符属性的 DRY 方法
  • 使用 PHP SDK 在 Facebook 页面上发帖

    我想通过我的网站在页面上发布 我在文档中没有找到任何可以帮助我的内容 谷歌结果也没有给出我的答案 function post facebook data null result require once ROOT apps configur
  • 在字符第 n 次出现时剪切字符串

    我想做的是取一个字符串 例如 this those that 并从第 n 次出现的字符获取子字符串 因此 从字符串的开头到第二次出现 会回来 this those 同样 从第二次出现开始 到字符串末尾将返回 that 抱歉 如果我的问题很模
  • this.constructor.prototype —— 不能完全覆盖,但可以编写单独的 props?

    TL DR 为什么我不能从构造函数内覆盖构造函数的原型 我正在弄清楚我的原型继承模式 我不喜欢原型通常如何从构造函数外部定义 并且希望在逻辑上更好地封装事物 我发现我期望的那条神奇的路线不起作用 function Orifice this
  • opencv - 视频编写器控制比特率

    我有一个可用的 python 脚本 它使用 opencv 的视频编写器 source https gist github com stanchiang b4e4890160a054a9c1d65f9152172600 如果我接收一个文件 无
  • 如何在.Net 中处理多达 100k HTTP 连接

    我正在创建一个服务器来监视网页上客户端的在线状态 将同时监控 80 100 000 八万 个客户端 我正在使用 Net 来编写此内容 客户端将使用 JavaScript 在 HTML 页面上 联系 单独的 服务器 告诉服务器它们处于活动状态
  • 为什么mov指令使用ax而不是直接使用两个段寄存器?

    我看到这样的代码 mov ax cs mov ds ax mov es ax 为什么我不能将其压缩为 mov ds cs mov es cs 由于使用累加器寄存器 第一种方法是否更快 但这似乎不直观 因为 cs 和 ds 是段寄存器 还是有
  • URL 编码将“&”(与号)视为“&”HTML 实体

    我正在对将在 URL 中传递的字符串进行编码 通过 GET 但如果我使用escape encodeURI or encodeURIComponent 将被替换为 26amp 3B 但我希望将其替换为 26 我究竟做错了什么 如果没有看到你的
  • 将字符串转换为带有时区java的适当日期

    我正在与它的时区进行约会 我想将其转换为另一个时区 例如我的日期为 3 15 2013 3 01 53 PM 位于时区 GMT 06 00 我想将其转换为 GMT 05 00 时区 我进行了很多搜索 但我对 Date 的实际工作原理感到困惑
  • JSF 使用 EL 测试全局消息的存在

    我尝试仅在 JSF 队列中有全局消息时才显示块 我尝试使用rendered not empty facesContext getMessageList null 但它总是被评估为 false 我发现的唯一方法是创建一个自定义 EL 函数并在
  • 如何将 Flutter 画布保存为位图图像?

    我有一个颤振canvas 我想将该画布保存为位图图像 例如 PNG 但任何常见的位图格式都可以 将画布中的位转换为位图图像格式的最佳方法是什么 创建一个PictureRecorder 创建一个Canvas和你的PictureRecorder
  • 制作实时时钟 javascript

    有谁知道如何让实时 JavaScript 时间运行 我有这个 php 代码 expiredate date d m Y G i s rdate1 f ex date explode expiredate f ex time explode
  • Common Lisp 中 eq、eql、equal 和 equalp 之间有什么区别?

    有什么区别eq eql equal and equalp 在 Common Lisp 中 我知道其中一些检查类型 一些检查跨类型等等 但哪个是哪个 什么时候使用其中一种比其他更好 From Common Lisp 等式谓词 eq x y 为
  • 在 emacs 中,cl-flet 和 cl-letf 有什么区别?

    据我了解 两者都是用来临时改变函数的值 超越事实cl flet是一个函数并且cl letf是宏 什么时候使用它们 绑定可以是递归的 如果函数定义用名字称呼自己 哪个函数会被调用 比较cl flet vs cl labels行为 范围是词汇上