Skip to content

Instantly share code, notes, and snippets.

@RainMark
Forked from caiorss/macros.el
Created July 22, 2020 03:09
Show Gist options
  • Save RainMark/8454689f4d8eb11253fdc1de6aed1dd2 to your computer and use it in GitHub Desktop.
Save RainMark/8454689f4d8eb11253fdc1de6aed1dd2 to your computer and use it in GitHub Desktop.
Emacs Lisp/Elisp Macro Examples
;; Elisp session in REPL IELM
;;
;;
;;
ELISP> (defmacro inc (var)
(list 'setq var (list '1+ var)))
inc
ELISP> (setq x 0)
0 (#o0, #x0, ?\C-@)
ELISP> (inc x)
1 (#o1, #x1, ?\C-a)
ELISP> (inc x)
2 (#o2, #x2, ?\C-b)
ELISP> (inc x)
3 (#o3, #x3, ?\C-c)
ELISP> (inc x)
4 (#o4, #x4, ?\C-d)
ELISP>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ELISP> (defmacro setzero (var)
`(setq ,var ,0))
setzero
ELISP> (setzero x)
0 (#o0, #x0, ?\C-@)
ELISP>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ELISP> (defmacro set-nill (var)
(list 'setq var nil))
set-nill
ELISP> (setq x 10)
10 (#o12, #xa, ?\C-j)
ELISP> (setq y 20)
20 (#o24, #x14, ?\C-t)
ELISP>
ELISP> (set-nill x)
nil
ELISP> (set-nill y)
nil
ELISP>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmacro major-mode-eql (mode)
`(eql major-mode ,mode))
major-mode-eql
ELISP>
ELISP> (major-mode-eql 'ielm)
nil
ELISP> major-mode
inferior-emacs-lisp-mode
ELISP>
ELISP> (major-mode-eql 'inferior-emacs-lisp-mode)
t
ELISP>
ELISP> (major-mode-eql 'python-mode)
nil
ELISP> (major-mode-eql 'tuareg-mode)
nil
ELISP>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ELISP> (defmacro foreach (x in lst &rest body)
`(let ((l ,lst))
(while (car l)
(let ((x (car l)))
,@body)
(setq l (cdr l)))))
foreach
ELISP> (foreach x in '(1 2 3)
(princ x))
123
nil
ELISP>
ELISP> (foreach x in '(1 2 3)
(print x))
1
2
3
nil
ELISP>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ELISP> (defmacro get-home-path () '(getenv "HOME"))
get-home-path
ELISP> (get-home-path)
"/home/tux"
ELISP>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ELISP> (setq op '+)
+
ELISP> (eval `(,op 1 1))
2 (#o2, #x2, ?\C-b)
ELISP>
ELISP> (defmacro rpn (arg1 arg2 op)
(list op arg1 arg2))
rpn
ELISP> (rpn 1 2 +)
3 (#o3, #x3, ?\C-c)
ELISP> (rpn 10 2 +)
12 (#o14, #xc, ?\C-l)
ELISP>
ELISP> (macroexpand '(rpn 1 2 +)) ;;;; Macro Expand is useful to debug and test macros
(+ 1 2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ELISP> (defmacro inc (var)
(list 'setq var (list '1+ var)))
inc
ELISP>
ELISP> (macroexpand '(inc r))
(setq r
(1+ r))
ELISP> (defmacro inc2 (var1 var2)
(list 'progn (list 'inc var1) (list 'inc var2)))
inc2
ELISP>
ELISP> (macroexpand '(inc2 r s))
(progn
(inc r)
(inc s))
ELISP>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ELISP>
ELISP> (defmacro makeAbrevFun (name val)
`(defun ,(eval name) () (insert ,val)))
makeAbrevFun
ELISP> (makeAbrevFun 'hello "hello world")
hello
ELISP> (hello)
nil
ELISP> hello world
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment