将函数映射到点对
Mapping a function to a dotted pair
我想将一个函数 (lambda (x) (+ x 1))
映射到一个点对 '(1 . 2)
,以获得另一个点对 '(2 . 3)
。我已经测试了以下代码无济于事:
(defun mapdot (func coll)
((funcall func (car coll)) . (funcall func (cdr coll))))
ELISP> (mapdot (lambda (x) (+ x 1)) '(1 . 2))
*** Eval error *** Invalid function: (funcall func (car coll))
我怎样才能实现这种行为?
由于我不愿意切换到命令式风格,所以我忽略了一个简单的解决方案:创建一个虚拟列表并手动设置它的 car
和 cdr
。
(defun mapdot (func coll)
(let ((temp-list '(1 2)))
(progn
(setf (car temp-list) (funcall func (car coll)))
(setf (cdr temp-list) (funcall func (cdr coll)))
temp-list)))
现在它运行得很好:
ELISP> (mapdot (lambda (x) (+ x 1)) '(1 . 2))
(2 . 3)
您的第一次尝试遇到了问题,因为它试图使用 (funcall func (car coll))
作为要调用的函数的名称 - 这当然行不通。为了让错误更清楚,就好像你在这样做:
ELISP> ((list))
*** Eval error *** Invalid function: (list)
解决方案是使用 cons
或准引用:
ELISP> (defun mapdot (func coll)
(cons (funcall func (car coll)) (funcall func (cdr coll))))
mapdot
ELISP> (mapdot (lambda (x) (+ x 1)) '(1 . 2))
(2 . 3)
ELISP> (defun mapdot (func coll)
`(,(funcall func (car coll)) . ,(funcall func (cdr coll))))
mapdot
ELISP> (mapdot (lambda (x) (+ x 1)) '(1 . 2))
(2 . 3)
我想将一个函数 (lambda (x) (+ x 1))
映射到一个点对 '(1 . 2)
,以获得另一个点对 '(2 . 3)
。我已经测试了以下代码无济于事:
(defun mapdot (func coll)
((funcall func (car coll)) . (funcall func (cdr coll))))
ELISP> (mapdot (lambda (x) (+ x 1)) '(1 . 2))
*** Eval error *** Invalid function: (funcall func (car coll))
我怎样才能实现这种行为?
由于我不愿意切换到命令式风格,所以我忽略了一个简单的解决方案:创建一个虚拟列表并手动设置它的 car
和 cdr
。
(defun mapdot (func coll)
(let ((temp-list '(1 2)))
(progn
(setf (car temp-list) (funcall func (car coll)))
(setf (cdr temp-list) (funcall func (cdr coll)))
temp-list)))
现在它运行得很好:
ELISP> (mapdot (lambda (x) (+ x 1)) '(1 . 2))
(2 . 3)
您的第一次尝试遇到了问题,因为它试图使用 (funcall func (car coll))
作为要调用的函数的名称 - 这当然行不通。为了让错误更清楚,就好像你在这样做:
ELISP> ((list))
*** Eval error *** Invalid function: (list)
解决方案是使用 cons
或准引用:
ELISP> (defun mapdot (func coll)
(cons (funcall func (car coll)) (funcall func (cdr coll))))
mapdot
ELISP> (mapdot (lambda (x) (+ x 1)) '(1 . 2))
(2 . 3)
ELISP> (defun mapdot (func coll)
`(,(funcall func (car coll)) . ,(funcall func (cdr coll))))
mapdot
ELISP> (mapdot (lambda (x) (+ x 1)) '(1 . 2))
(2 . 3)