lisp - 需要了解带递归的 LISP 程序

标签 lisp clisp

(defun help(a x)
  (if (null x) nil
    (cons (cons a (car x)) (help a (cdr x)))))

(defun partition(x)
    (if (null x) '(nil)
    (append (help (car x) (partition(cdr x))) (partition(cdr x)))))

它是这样工作的:(partition '(a b)) -> ((A B) (A) (B) NIL) 我试图了解它是如何工作的。有人可以说明发生了什么事吗?我试着按照代码写在纸上,但我失败了。

最佳答案

trace 函数允许您可视化 LISP REPL 中的函数调用。

sbcl 的示例输出

* (defun help(a x)
  (if (null x) nil
    (cons (cons a (car x)) (help a (cdr x)))))

HELP
* (defun partition(x)
  (if (null x) '(nil)
    (append (help (car x) (partition(cdr x))) (partition(cdr x)))))

PARTITION
* (trace help)

(HELP)
* (trace partition)

(PARTITION)
* (partition '(a b))
  0: (PARTITION (A B))
    1: (PARTITION (B))
      2: (PARTITION NIL)
      2: PARTITION returned (NIL)
      2: (HELP B (NIL))
        3: (HELP B NIL)
        3: HELP returned NIL
      2: HELP returned ((B))
      2: (PARTITION NIL)
      2: PARTITION returned (NIL)
    1: PARTITION returned ((B) NIL)
    1: (HELP A ((B) NIL))
      2: (HELP A (NIL))
        3: (HELP A NIL)
        3: HELP returned NIL
      2: HELP returned ((A))
    1: HELP returned ((A B) (A))
    1: (PARTITION (B))
      2: (PARTITION NIL)
      2: PARTITION returned (NIL)
      2: (HELP B (NIL))
        3: (HELP B NIL)
        3: HELP returned NIL
      2: HELP returned ((B))
      2: (PARTITION NIL)
      2: PARTITION returned (NIL)
    1: PARTITION returned ((B) NIL)
  0: PARTITION returned ((A B) (A) (B) NIL)
((A B) (A) (B) NIL)

除此之外,我不确定如何提供更多帮助。

关于lisp - 需要了解带递归的 LISP 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16492069/

相关文章:

macos - OS X 的最佳 Scheme 或 LISP 实现是什么?

lisp - 关于 Winston 和 Horn 在 "Lisp"中的问题 19-2 的问题

lisp - 使用 defstruct 在结构中定义函数

macros - 有什么方法可以查看 Common Lisp 中内置宏的实现吗?

common-lisp - LISP 有类似 SBCL sb-ext :*posix-argv*? 的东西吗

lisp - sbcl(和 clisp): When is a character not a character?(使用 defconstant)

lisp - 如何在 Windows 中安装 gtk-cffi?

macros - 如何在 lisp 中用 if 形式定义递归 cond 宏?

macros - 发现 Common Lisp 的 "Core"实体和宏

lisp - 条件照应收集最佳实践?