2

我是 lisp 的新手,我尝试在 lisp 中编写一个程序,计算二项式系数迭代(阶乘)但不是递归的。我试过everthing,全局函数,局部函数(阶乘)),但我的程序不起作用,例如当我命令:(binom(7 4))时,出现错误

    SELECT ALL
(defun binom-coef(a b)   
       (if (or (< a b) (< b 0))
       nil            )    
      
       (flet fakul(n)    ; factorial
               (cond ((= n 0) 1)
              (t (* n (fakul (- n 1))))))
   (/ (fakul a) (* (fakul b) (fakul(- a b)))))

我还有一个问题,如何在 emacs 中编译?

(我尝试在缓冲区 -> scatch ->(加载“binom-coeff.el”但只有一条错误消息......)

非常感谢, :)

4

3 回答 3

3

无论您是在 Common Lisp 还是 emacs-lisp 中学习/编程,您都必须下定决心。它们相似但不同,在学习时,混乱可能是一个障碍。

要学习 Emacs Lisp,请阅读:

Emacs Lisp 编程简介 http://www.gnu.org/software/emacs/emacs-lisp-intro/ 或输入 emacs M-: (info "(eintr)Top") RET

要了解 Common Lisp,请查看http://cliki.net/Getting+Started

于 2012-06-08T17:17:42.953 回答
1

你最好的办法是用 EMACS 安装 SLIME。它使用 SBCL,它是 common lisp 的一个版本。尝试 CC CC 或 CC CK 编译。然后CC CZ打开一个新的缓冲区并运行程序。我也在努力自学。在学习一门新语言的同时学习 EMACS 并不是一件容易的事。至少对我来说。

于 2012-06-11T03:21:06.447 回答
1

我喜欢这个教程http://steve-yegge.blogspot.com/2008/01/emergency-elisp.html它非常简短而且内容丰富。

如果它是您想要的省略号,只需在右括号后使用 Cx Ce 即可。你在那里有很多错误。

(defun binom-coef(a b)
  ;; (if (or (< a b) (< b 0)) nil)
  ;; Wery strange expression. (if CONDITION IF-TRUE IF-FALSE). You
  ;; didn't set IF-FALSE, so it's nil by default, 
  ;; and you set IF-TRUE to nil. It allways returns nil.

  ;; If you want to leave from function when wrong args given
  (block nil
    (if (or (< a b) (< b 0)) (return))
  ;; can be throw/catch also

    ;; (flet fakul(n)
    ;;   ;; wrong usage of flet. It's used like let, (flet ((name1 args1
    ;;   ;; body1) (name2 args2 body2) ... )
    ;;   ;; BODY-WHERE-FUNCTIONS-ARE-VISIBLE)
    ;;   (cond
    ;;     ((= n 0) 1)
    ;;     (t (* n (fakul (- n 1))))
    ;;     ))

    (flet ((fakul (n)
             (cond
               ((= n 0) 1)
               (t                       ; shound be like (< 0 n)
                 (* n (fakul (- n 1))))
               )))
      (fakul 5)
      ;; => 120
      (/ (fakul a) (* (fakul b) (fakul(- a b))))
      ;; ^ Inside flet ^
      ))
  )
(binom-coef 8 3)  ; <= look, it's not (8 3), because (8 3) means
                  ; execute function `8' with argument 3. If you
                  ; wanted to pass list with 8 and 3, it should be
                  ; (quote (8 3)), or simply '(8 3)
;; => 56
于 2012-06-12T20:39:17.843 回答