You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Common Lisp中Lambda函数的参数person如何被赋值?

问题

我定义了如下列表:

(defvar moo '((:name "vince" :age 35)
              (:name "jess" :age 30)))

并调用如下函数:

(defun test (name)
  (remove-if-not
   #'(lambda (person) (equal (getf person :name) name))
   moo))

(test "vince") ;; 函数调用
;; => ((:name "vince" :age 35))

在Lambda函数中,参数person是如何被赋值的?我仅在test函数中传入了name参数,不清楚person的来源。

回答

person的赋值是由remove-if-not函数自动完成的:

  • remove-if-not是Lisp里的序列遍历函数,它会逐个取出第三个参数(也就是全局变量moo)里的每个元素
  • 每取出一个元素,就把这个元素作为实参传给你定义的lambda函数的形参person
  • lambda函数判断当前这个person的:name是否和test函数传入的name相等,remove-if-not会保留所有判断为真的元素,最终返回符合条件的结果

具体执行流程如下:

  1. 调用(test "vince")时,name被赋值为"vince"
  2. remove-if-not开始遍历moo里的第一个元素(:name "vince" :age 35),把它传给lambda的person
  3. lambda执行(equal (getf person :name) "vince"),结果为真,这个元素被保留
  4. 接着遍历第二个元素(:name "jess" :age 30),传给person后判断结果为假,这个元素被排除
  5. 最终返回保留的元素列表((:name "vince" :age 35))

简单说,person就是moo列表里的每一个“人员”元素,由remove-if-not在遍历过程中自动传递给lambda,不需要你手动传入。

内容的提问来源于stack exchange,提问作者Vinn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:20:42