Tag: elisp

  • Project Euler No. 2 in Emacs elisp

    My second Project Euler solution.
    Project Euler No. 2
    This was a little tougher to solve than No. 1. I decided to use recursion to solve it, and as I haven’t had to write anything that used recursion since I was at Uni, it took me a while go remember how to do it. Also, it was an elisp learning exercise.
    Things I learnt:

    1. successive statements inside an if statement need to be inside a progn.
    2. passing in the evens variable was the way to solve this without needing a static variable. Thanks to spacebat for that one. Apparently that is the functional programming way of doing things.
    ;; Project Euler no 2. Calculate the sum of all even terms in the
    ;; fibonacci sequence of numbers that do not exceed 4,000,000
    (defun fibonacci (x y)
      "calculate the next number in the fibonacci sequenece"
      (+ x y))
    (defun fibonacci-sum  (fib1 fib2 target &optional evens)
      "find the next fibonacci number bigger than target, given fib1 and fib2"
      (unless evens
        (setq evens 0))
      (let ((fib3 (fibonacci fib1 fib2 ))
            )
        (if (<=  fib3 target)
            (progn (if (zerop (mod fib3 2))
                       (setq evens (+ fib3 evens)))
                   (message (format "fib3 is: %d, evens: %d" fib3 evens))
                   (setq fib3  (fibonacci-sum fib2 fib3 target evens)))
          (format "fib3: %d > %d target, evens = %d" fib3 target evens)
          )
        )
      )
    (fibonacci-sum 0 1 4000000)
    
  • Indenting of comments in emacs-lisp mode

    Emacs-lisp mode indents comments based on the number of semi-colons prefixing them.
    One semi-colon indents to column 40.
    Two semi-colons indent to the same level as the block you are in.
    Three semi-colons indent to wherever you place it and don’t move if you press <TAB>

    ;;; column:
    ;;;34567890123456789012345678901234567890123456789
                                            ; one semi-colon
    (when (some case)
      ;; two semi-colons indents to the appropriate level
      (second line)
      )
    ;; two semi-colons indents to the appropriate level
          ;;; I want this comment to stay right here