2012-06-08 3 views
2

je suis un débutant en lisp, j'essaye de programmer un programme en lisp, qui calcule le coefficient binomial itératif (factoriel) mais pas récursif. essayer everthing Ive, fonction globale, fonction locale (factoriel)), mais mon travail doesnt programm, par exemple quand je prescris: (binom (7 4)), juste obtenu une erreurcoefficient binomial LISP, factorielle

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))))) 

J'ai encore une question, comment compiler dans emacs?

(i essayé dans un tampon ->scatch -> (charge "binom-coeff.el" mais Theres seulement un message d'erreur ...)

Un grand merci, :)

+0

Voici une bonne introduction livre Common Lisp pour le téléchargement: http://www.cs.cmu.edu/~dst/LispBook/index.html Sinon, vous devriez chercher une introduction Emacs Lisp. –

Répondre

3

Vous devez vous décider si vous apprenez ou programmez en Common Lisp ou en emacs-lisp. Ils sont similaires mais différents, et lors de l'apprentissage, la confusion peut être un obstacle.

Pour en savoir Lisp lire:

Introduction à la programmation dans Emacs Lisp http://www.gnu.org/software/emacs/emacs-lisp-intro/ ou tapez emacs M-: (info "(EINTR) Top") RET

Pour en apprendre davantage sur Common Lisp, ont un coup d'oeil à http://cliki.net/Getting+Started

1

Votre meilleur pari est d'installer SLIME avec EMACS. Il utilise SBCL qui est une version de Lisp commun. Essayez C-C C-C ou C-C C-K pour compiler. Puis C-C C-Z pour ouvrir un nouveau tampon et exécuter le programme. J'essaie de m'apprendre aussi. Apprendre l'EMACS tout en apprenant une nouvelle langue n'est pas la chose la plus facile à faire. Au moins pour moi.

1

J'aime ce tutoriel http://steve-yegge.blogspot.com/2008/01/emergency-elisp.html c'est vraiment court et instructif.

Si c'est ce que vous voulez, utilisez simplement C-x C-e après la fermeture de la parenthèse. Vous avez eu un certain nombre d'erreurs là-bas.

(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