我对 lisp 很陌生。我正在尝试编写一个名为 x2y 的函数,它接受 2 个整数参数 x 和 y,并返回从 x 开始并以 y 结束的整数列表
(defun xtoy (X Y)
(cond ((> X Y) (list nil))
((= X Y) (list Y)))
(T (append (list X) x2y(+ 1 X) Y)))))
我对 lisp 很陌生。我正在尝试编写一个名为 x2y 的函数,它接受 2 个整数参数 x 和 y,并返回从 x 开始并以 y 结束的整数列表
(defun xtoy (X Y)
(cond ((> X Y) (list nil))
((= X Y) (list Y)))
(T (append (list X) x2y(+ 1 X) Y)))))
在 elisp 中,您正在寻找C-hf number-sequence
RET.
您在问题中提供的代码处于非常混乱的状态。Emacs 可以为您突出显示括号。这足以让我在不进行任何调试的情况下修复您的代码:
(defun xtoy (X Y)
(cond ((> X Y) (list nil))
((= X Y) (list Y))
(t (append (list X) (xtoy (+ 1 X) Y)))))
这是您打开突出显示的方式:
(setq show-paren-mode t)
*scratch*
在or中进行大部分编辑ielm
- 它们使事情变得更容易。
从 abo-abo 的版本开始,可以简化很多:
1) 去掉 (= XY) 并在 (> XY) 中用 nil 替换 (list nil)
(defun xtoy (X Y)
(cond ((> X Y) nil)
(t (append (list X) (xtoy (+ 1 X) Y)))))
2) 简化cond
为if
语句
(defun xtoy (X Y)
(if (<= X Y)
(append (list X) (xtoy (+ 1 X) Y))
nil))
3) 省略 final nil
,因为这是条件不匹配时隐式返回的内容
(defun xtoy (X Y)
(if (<= X Y)
(append (list X) (xtoy (+ 1 X) Y))))
4)使用cons
代替append
(defun xtoy (X Y)
(if (<= X Y)
(cons X (xtoy (+ 1 X) Y))))
如果您需要有关您的功能的帮助,我建议您使用cons
而不是list
从头开始使用累加器。
(defun xtoy (from to &optional acc)
(if (> from to)
acc
(xtoy from (- to 1) (cons to acc))))