-2

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

4 回答 4

3

在 elisp 中,您正在寻找C-hf number-sequence RET.

于 2013-10-22T20:57:40.613 回答
2

您在问题中提供的代码处于非常混乱的状态。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- 它们使事情变得更容易。

于 2013-10-22T21:06:01.047 回答
2

从 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) 简化condif语句

(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))))
于 2013-10-22T21:35:36.310 回答
1

如果您需要有关您的功能的帮助,我建议您使用cons而不是list从头开始使用累加器。

(defun xtoy (from to &optional acc)
  (if (> from to)
      acc
      (xtoy from (- to 1) (cons to acc))))
于 2013-10-22T21:20:13.793 回答