繁体   English   中英

将 function 映射到点对

[英]Mapping a function to a dotted pair

我想 map 和 function, (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))

我怎样才能实现这种行为?

您在第一次尝试时遇到了问题,因为它尝试使用(funcall func (car coll))作为要调用的 function 的名称 - 这当然不起作用。 为了使错误更清楚,就好像您正在这样做:

ELISP> ((list))
*** Eval error ***  Invalid function: (list)

解决方案是使用cons或 quasiquote:

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)

由于我不愿意切换到命令式样式,因此我忽略了一个简单的解决方案:创建一个虚拟列表并手动设置它的carcdr

(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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM