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会保留所有判断为真的元素,最终返回符合条件的结果
具体执行流程如下:
- 调用
(test "vince")时,name被赋值为"vince" remove-if-not开始遍历moo里的第一个元素(:name "vince" :age 35),把它传给lambda的person- lambda执行
(equal (getf person :name) "vince"),结果为真,这个元素被保留 - 接着遍历第二个元素
(:name "jess" :age 30),传给person后判断结果为假,这个元素被排除 - 最终返回保留的元素列表
((:name "vince" :age 35))
简单说,person就是moo列表里的每一个“人员”元素,由remove-if-not在遍历过程中自动传递给lambda,不需要你手动传入。
内容的提问来源于stack exchange,提问作者Vinn
相关产品推荐
相关产品推荐

