lisp中的一个函数叫做xtoy,它返回一个从x到y的列表

时间:2013-10-22 20:56:14

标签: lisp common-lisp practical-common-lisp ansi-common-lisp

我对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)))))

4 个答案:

答案 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))))