Elisp notes
<yambe:breadcrumb>Emacs</yambe:breadcrumb>
Elisp notes
Executing elisp code
- We can use
- lisp-interaction-mode
- command to change mode in which current buffer is evaluated from Fundamental or other to Lisp Interaction.
- We can evaluate expression by placing cursor at end of expression to be evaluated and using C-j key
5
evaluates to
5
Basic elisp types are
Value | Type |
5 | Number |
5.6 | Floats |
"Abc" | String |
'sym1 | Symbol |
'(1 2 3) | List |
(list 1 2 3) | List |
t | true |
nil | false |
nil | empty list |
Functions
Functions can be defined using defun
(defun factorial (n) "Factorial function" (if (= n 0) 1 (* n (factorial (- n 1)))))
We can call user-defined functions just like in-built functions in elisp code.
(factorial 5)
Note for this call to work one needs to compile factorial function definition using Ctrl+j short-cut first.
If function requires more than one arguments then arguments should be separated by space
(defun add2(x y) "Adds two numbers" (+ x y))
Constants
We can use defconst to define constants
(defconst const1 3)
Using let
let works like in scheme but has dynamic scope and not lexical scope
(let ((x 3)) (+ x 3))
would return 6
Using car and cdr
car and cdr work like first and rest of scheme
(car '(1 2 3)) ;;Returns 1 (cdr '(1 2 3)) ;; Returns list '(2 3) (cdr nil) ;;Could have been error, but is nil :(
Printing values
print can be used to print values
(print "2 + 2 is 4")
Note this would print "2 + 2 is 4" twice. Once due to print statement and other as execution of elisp code prints return value in buffer.
To print just once one can use message function:
(message "hi")
Message can also be used to print variable values or constants:
(message "My age is %d" 25)
Here, %d is used to indicate integer. One can also use "%S" which can print generic values including lists.
Modifying values of variables
setq works like set! of scheme
(setq p1 3) (setq p1 (+ 2 p1))
Using if
Basic syntax of if is
(if <condition> <statement-for-true> <statement-for-false>)
For example,
(if (< a 5) (message "a(%d) is less than 5" a) (message "a(%d) is greater than or equal to 5" a))
Interactive functions
When functions are declared as interactive then they can be executed as commands using M-x. For example:
(defun hello() "Inserts hello world at cursor position" (interactive) (insert "Hello world"))
The above function can be compiled using C-j and then executed using "M-x hello <RET>"
Interactive functions can take one argument from user using:
(defun call-factorial (num1) "Calls factorial function" (interactive "nEnter number for factorial : ") (message "Factorial of %d is %d" num1 (factorial num1)))
Arguments can also be taken from univeral argument list built with "C-u <argument>" using:
(defun factorial (x) "FActorial function" (if (= x 0) 1 (* x (factorial (- x 1))))) (defun univ-factorail (N) "Factorial using universal argument" (interactive "p") (message "Factorial of %d is %d" N (factorial N)))
More information can be learned from http://ergoemacs.org/emacs/elisp.html
<yambe:breadcrumb>Emacs</yambe:breadcrumb>