Emacs Lisp 可以将 lambda 形式分配给像Scheme 这样的变量吗?

2024-05-16

在研究 Emacs Lisp 的符号单元时,我发现像这样的示例函数

(defun a (&rest x)
    x)

我可以打电话(symbol-function 'a),返回(lambda (&rest x) x)。如果我愿意的话我可以使用它

> ((lambda (&rest x) x) 1 2 3 4 5)
(1 2 3 4 5)

其功能与上面的原始功能相同。现在,这让我想起了Scheme,其中lambda表达式是函数的主体,并被分配给Scheme的通用变量名define。例如

(define atom?
    (lambda (x)
        (and (not (pair? x)) (not (null? x)))))

只需将 lambda 表达式分配给atom?- 现在atom?是一个函数。那么 elisp 可以做到这一点,即将 lambda 表达式分配给一个符号,然后将其用作函数吗?我试过了

(setq new-a (lambda (&rest x) x))

这使(void-function new-a)如果我尝试将它用作函数。在这个问题上有没有办法模仿Scheme世界呢?看来一定有办法。否则为什么功能细胞会a包含(lambda (&rest x) x)如果我们不能把这个 lambda 表达式变成一个函数呢?


schema 和 emacs lisp(实际上是大多数其他 lisp)之间的一个重要区别是,scheme 有一个命名空间,而 emacs lisp 有单独的函数和变量命名空间。计算的列表形式中的第一个位置命名了一个函数,并且在函数名称空间中查找该名称。在方案中,所有名称都位于同一空间中,无论它出现在何处,都会查找并使用与该名称绑定的值。

这意味着在 emacs lisp 中你可以这样:

(defun f (x) (+ x x))
(setq f 2)
(f f) ;=> 4

这在方案中是不可能的,这里只有一个f如果你设置它的值,它就会从(比如说)一个函数变成一个数字。

在 emacs lisp 中有不同的方法来处理这个问题。

一种是使用诸如funcall and apply,它们接受一个函数和一些参数,并将函数应用于参数,如下所示:

(setq f (lambda (x) (+ x x)))
(funcall f 2) ;=> 4

另一种方法是操纵函数名称f方法。有一个函数叫做fset允许您将函数附加到名称(在函数命名空间中):

(fset 'f (lambda (x) (+ x x x)))
(f 2) ;=> 6

注意fset适用于名称(又名符号),因此名称f需要加引号,否则会被读取为变量的值。这就是为什么调用变量函数的原因setq,“q”代表“引用”,所以setq实际上是一个特殊的函数,它引用它的第一个参数,这样程序员就不必这样做。有一个等效的普通函数称为set不做任何引用,如:

(setq x 1)  ; x is 1
(set 'x 2)  ; x is 2
(setq x 'x) ; x is the symbol x
(set x 3)   ; x is now 3

最后一种形式可能看起来令人困惑,但作为set是一个范式,它会查找变量的值x,该值是符号x然后命名将要更改的变量(即x)。因此,优点之一是set的优点是可以设置您不知道名称但可以通勤的变量。

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

Emacs Lisp 可以将 lambda 形式分配给像Scheme 这样的变量吗? 的相关文章

  • 递归 lambda 表达式可能吗?

    我正在尝试编写一个调用自身的 lambda 表达式 但我似乎找不到任何语法 或者即使它是可能的 本质上我想将以下函数传输到以下 lambda 表达式中 我意识到这是一个愚蠢的应用程序 它只是添加 但我正在探索可以在 python 中使用 l
  • 在这种情况下,我如何处理 Function 和省略号/可变参数?

    我的项目之一是抛出 lambda 表达式 https github com fge throwing lambdas 我的目标是简化潜在的使用 FunctionalInterfaces in Streams 其在流中使用的唯一 缺陷 是它们
  • 在 Emacs 中,如何更改迷你缓冲区完成列表窗口?

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

    堆栈溢出 在过去的几天里 我试图稍微定制一下我的 emacs 但我遇到了我不知道如何解决的问题 我想做的是定义一个全局键绑定和一个 ido 模式键绑定 它们将使用相同的键来做不同的事情 Ido 模式键绑定定义如下 defun ido my
  • 创建 lambda 二维数组

    因此 我搜索了几个网站和其他有关此问题的问题 但似乎没有一个答案适合我 我有有效的代码 我的编程导师建议我更改链接if else if改为使用 lambda 表 我询问是否使用某种哈希表 他说仅对 9 个项目使用哈希 真正的程序有 9 个
  • 如何在函数内 malloc 结构体数组?代码以其他方式工作

    我正在尝试创建一个函数来创建可变大小的二维函数数组 我正在使用以下代码 它本身似乎工作得很好 typedef struct Starter Properties int TypeB int TypeF int TypeW Randomize
  • 从类 T 获取函数名 (__func__) 和指向成员函数的指针 void(T::*pmf)()

    是否可以写一些f 接受类型的模板函数T和一个指向签名成员函数的指针void T pmf 作为 模板和 或函数 参数并返回const char 指向成员函数的 func 变量 或损坏的函数名称 EDIT 我被要求解释我的用例 我正在尝试编写一
  • 访问默认 lambda 参数中的模板类参数

    我正在写一个简单的通用池 模板类在构造函数中采用一个参数 该参数是一个工厂函数 用于根据需要实例化池中的对象 template
  • TypeScript 接口函数属性:有什么区别?

    有人可以解释一下 为什么在这段代码中 对 Interface 类型常量的赋值有效 但对 Interface 类型常量的赋值会抛出错误 interface InterfaceA doSomething data object boolean
  • Python 宏:用例?

    如果 Python 有一个类似于 Lisp Scheme 的宏工具 比如元Python https code google com p metapython 你会如何使用它 如果您是一名 Lisp Scheme 程序员 您会使用宏来做什么
  • C++ 中带有 lambda 的简单自定义迭代器

    假设我有一个容器 其中包含int 一个作用于包含以下内容的容器的函数Point 并且我有一个函数可以给出一些int给我相应的Point它代表 想象一下我已经在一些大的场景中索引了场景中的所有点std vector
  • 忽略 Racket 中的多个返回值

    在 Racket 中 可以通过执行以下操作从函数返回多个值 define foo values 1 2 3 然后我们可以通过这样做来绑定它们 define values one two three foo Now one一定会1 two t
  • 基于扩展的 Emacs auto-minor-mode

    I found 这个问题 https stackoverflow com questions 1299193 in emacs how to automatically enable a minor mode based on buffer
  • (typeof variable === "function") 和 jQuery.isFunction() 有什么区别?

    我一直用 typeof variable function 我偶然发现jQuery isFunction 我想知道 jQuery方法中的typeof方法有什么区别 不仅有什么区别 而且 什么时候适合使用typeof方法 什么时候适合使用jQ
  • Java 8 中函数类型全等 lambda 表达式的用法

    我对 的定义和用法感到困惑 Stream collect Supplier
  • 从数据库结果生成多维数组的递归函数

    我正在编写一个函数 它接受页面 类别数组 来自平面数据库结果 并根据父 ID 生成嵌套页面 类别项目数组 我想递归地执行此操作 以便可以完成任何级别的嵌套 例如 我在一个查询中获取所有页面 这就是数据库表的样子 id parent id t
  • 无捕获 lambda 是结构类型吗?

    P1907R1 http www open std org jtc1 sc22 wg21 docs papers 2019 p1907r1 html 接受 C 20 引入结构类型 它们是非类型模板参数的有效类型 GCC 和 Clang 都接
  • 如何在 VS 2013 的立即窗口中执行 LINQ 和/或 foreach?

    在调试过程中探测当前状态时 立即窗口是非常有用的工具 我了解到 通过使用问号 人们可以在那里做更多的事情 如图所示在这篇文章中 https stackoverflow com questions 32934635 execute metho
  • Java 8 与 Java 9 中的 Stream.peek() 方法

    我正在学习 Java 8 lambda 表达式 想询问以下与以下相关的 Java 代码 peek https docs oracle com javase 9 docs api java util stream Stream html pe
  • Elisp 获取函数数量?

    我希望能够做到 function arity intern expt 我用谷歌搜索了这个解决方案https github com emacsmirror parser blob master parser fn el https githu

随机推荐