我对lisp很新。我正在尝试编写一个名为x2y的函数,它接受两个参数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)))))
答案 0 :(得分:3)
在elisp中,您正在寻找 C-h f number-sequence
RET 。
答案 1 :(得分:2)
您在问题中提供的代码处于非常混乱的状态。 Emacs可以为您突出显示parens。 这足以让我在没有任何调试的情况下修复你的代码:
(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*
或ielm
进行大部分修改 - 它们会让事情变得更轻松。
答案 2 :(得分:2)
从abo-abo的版本开始,您可以简化很多:
1)摆脱(= X Y)并在(> X Y)中用nil替换(列出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)遗漏最后的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))))
答案 3 :(得分:1)
如果您需要有关函数的帮助,我建议您使用cons
代替list
,并使用累加器从头开始。
(defun xtoy (from to &optional acc)
(if (> from to)
acc
(xtoy from (- to 1) (cons to acc))))