我是lisp的新手, 我尝试在lisp中编程一个程序,它计算二项式系数迭代(阶乘)但不递归。 我试过everthing,全局函数,局部函数(factorial)), 但我的程序不起作用,例如当我命令:(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中编译?
(我试过缓冲区 - &gt; scatch - &gt;(加载“binom-coeff.el” 但只有一条错误信息...)
非常感谢,:))
答案 0 :(得分:3)
无论您是在Common Lisp还是在emacs-lisp中学习/编程,都必须下定决心。它们相似但不同,在学习时,混淆可能是一个障碍。
要学习Emacs Lisp,请阅读:
Emacs中的编程简介Lisp http://www.gnu.org/software/emacs/emacs-lisp-intro/或输入emacs M- :( info&#34;(eintr)Top&#34;)RET
要了解Common Lisp,请查看http://cliki.net/Getting+Started
答案 1 :(得分:1)
您最好的选择是使用EMACS安装SLIME。它使用SBCL,这是常见的lisp版本。尝试使用C-C C-C或C-C C-K进行编译。然后用C-C C-Z打开一个新的缓冲区并运行程序。我也想自学。在学习新语言的同时学习EMACS并不是最容易的事情。至少对我而言。
答案 2 :(得分:1)
我喜欢这个教程http://steve-yegge.blogspot.com/2008/01/emergency-elisp.html它非常简短且信息丰富。
如果它是你想要的elisp,只需在关闭括号后使用C-x C-e。那里你有很多错误。
(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