常见的lisp让绑定

时间:2011-08-04 03:25:59

标签: binding lisp common-lisp

我有一个函数用可选参数计算二项式展开,以指定开始和结束项:

(defun comb-index (s k)
  (let ((combinations nil))
    (labels ((rec (s k offset entry)
               (cond ((equal s k)
                      (push (reverse (loop
                                     for i from 1 to s
                                     do (push (1- (+ i offset)) entry)
                                     finally (return entry)))
                            combinations))
                     ((equal k 0)
                      (push (reverse entry) combinations))
                    (t (rec (1- s) (1- k) (1+ offset) (cons offset entry))
                       (rec (1- s) k (1+ offset) entry)))))
      (rec s k 0 nil))
   (nreverse combinations)))

(defun binomial (k &key (start 1) end)
    (let ((b start)
          (e (if (null end) k end)))
      (labels ((rec (i)
                 (cond ((equal i e)
                        (comb-index k e))
                       (t
                        (append (comb-index k i) (rec (1+ i)))))))
        (rec b))
     )
    )

当我编译并运行此代码时,它将产生以下运行时错误:

Unhandled memory fault at #x18.
   [Condition of type SB-SYS:MEMORY-FAULT-ERROR]

这是由e引起的,但我不确定原因。我可以通过将'e'分配给'k'或'end'来避免这个问题,或者只是使用(当......)将'end'设置为'k',如果它是nil,但是我不知道为什么这不起作用。

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

代码中的问题并不明显;它似乎只是一个真正的溢出。有什么方法可以调整底层Lisp系统可用的内存吗?命令行标志还是什么?

您是否可以选择使用Clojure等可以创建延迟序列的语言来实现此功能?您可能已经意识到,这种类型的计算有可能产生极大的结果。我似乎记得在一个Clojure / contrib库中做了一些只做这个计算的东西。