-
-
Save zilongshanren/7ca3ba35a66872343dbe0f6617a84938 to your computer and use it in GitHub Desktop.
Emacs Lisp/Elisp Macro Examples
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; 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