Redefine lambda syntax to λ
(defmacro λ (args body) `(lambda ,args ,body)) ELISP> (λ (x) (+ x 3)) (lambda (x) (+ x 3)) ELISP> (mapcar (λ (x) (+ x 3)) '(1 2 3 4 5 6)) (4 5 6 7 8 9)
Set variable to nil
(defmacro nil! (var) `(setq ,var nil)) ELISP> (setq x 10) 10 ELISP> x 10 ELISP> ELISP> (nil! x) nil ELISP> x nil ELISP> ELISP> (nil! z) nil ELISP> z nil ELISP>
Create Clojure def, defn and fn special forms
(defmacro fn (args body) `(lambda ,args ,body)) (defmacro def (name value) `(setq ,name ,value)) (defmacro defn (name args body) `(defun ,name ,args ,body)) ELISP> (fn (x) (* x x)) (lambda (x) (* x x)) ELISP> (mapcar (fn (x) (* x x)) '(1 2 3 4 5)) (1 4 9 16 25) ELISP> (def x 1000) 1000 ELISP> x 1000 ELISP> ELISP> (defn f (x y z) (+ (* 3 x) (* -4 y) (* 5 z))) f ELISP> (f 4 5 6) 22 ELISP>
Clojure - Thread-First Macro
See also:
(defun foldl (f acc xss) (if (null xss) acc (foldl f (funcall f acc (car xss)) (cdr xss)))) (defun pass-result (x sexp) (if (listp sexp) `(,(car sexp) ,x ,@(cdr sexp)) `(,sexp ,x))) (defmacro -> (x &rest exprs) (foldl #'pass-result x exprs)) (-> 5 exp (/ 20) (+ 10 20) (- 3) log10) ELISP> (macroexpand '(-> 5 exp (/ 20) (+ 10 20) (- 3) log10)) (log10 (- (+ (/ (exp 5) 20) 10 20) 3)) Or (log10 (- (+ (/ (exp 5) 20) 10 20) 3)) ELISP> (pass-result 5 'exp) (exp 5) ELISP> (pass-result (pass-result 5 'exp) '(/ 20)) (/ (exp 5) 20) ELISP> (pass-result (pass-result (pass-result 5 'exp) '(/ 20)) '(+ 10 20)) (+ (/ (exp 5) 20) 10 20) ELISP>
Clojure - Thread-Last Macro
See: (->> x & forms)
(defun pass-result-last (x sexp) (if (listp sexp) `(,(car sexp) ,@(cdr sexp) ,x) `(,sexp ,x))) (defmacro --> (x &rest exprs) (foldl #'pass-result-last x exprs)) (--> 5 (/ 20) (+ 10 20) (- 16)) ELISP> (--> 5 (/ 20) (+ 10 20) (- 16)) -18 ELISP
Thread-Substitute Macro
(defun replace (targ subst lst) (if (null lst) '() (let ((hd (car lst)) (tl (cdr lst))) (if (equal targ hd) (cons subst (replace targ subst tl)) (cons (if (listp hd) (replace targ subst hd) hd) (replace targ subst tl)))))) (defun pass-result-subst (x sexp) (if (listp sexp) (replace '$ x sexp) `(,sexp ,x))) (defmacro $-> (x &rest exprs) (foldl #'pass-result-subst x exprs)) ELISP> (replace '$ 10 '(20 + $ * ( 3 + $ + 5 * (sqrt ($ - 5))))) (20 + 10 * (3 + 10 + 5 * (sqrt (10 - 5)))) ELISP> (macroexpand '($-> 500 (/ $ 20 ) (- 40 $) sqrt)) (sqrt (- 40 (/ 500 20))) ELISP> ($-> 500 (/ $ 20 ) (- 40 $) sqrt) 3.872983346207417 ELISP>
Clojure Let
(defmacro letc (bindings &rest body) `(let* ,(plist->alist bindings) ,@body)) ELISP> (letc ( a 10 b (+ a 3) c (+ a b) ) (list a b c)) (10 13 23) ELISP> ELISP> (macroexpand '(letc ( a 10 b (+ a 3) c (+ a b) ) (list a b c))) (let* ((a 10) (b (+ a 3)) (c (+ a b))) (list a b c)) ELISP>
Create Scheme Syntax define
(defmacro define (args body) (if (listp args) `(defun ,(car args) ,(cdr args) ,body) `(setq ,args ,body))) define ELISP> ELISP> (define x 50) 50 ELISP> x 50 ELISP> ELISP> (define (f x y) (+ (* 3 x) (* -4 y))) f ELISP> (f 5 6) -9 ELISP>
Rebind Elisp functions
Bind new names to existing elisp functions in order to create user friendly identifiers, for example, bind the symbol map to the function mapcar.
(defmacro rebindfun (new-name old-name) `(setf (symbol-function ,new-name) ,old-name)) ELISP> (rebindfun 'map #'mapcar) mapcar ELISP> ELISP> (map (lambda (x) (+ x 5)) '(1 2 3 4 5 6 7 8)) (6 7 8 9 10 11 12 13) ELISP> (rebindfun 'filter #'remove-if-not) remove-if-not ELISP> ELISP> (filter (lambda (x) (< x 10)) '(1 20 30 4 6 89 3 2 9 100)) (1 4 6 3 2 9) ELISP> (filter 'evenp '(1 2 3 4 5 6 7 8)) (2 4 6 8) ELISP> (filter 'oddp '(1 2 3 4 5 6 7 8)) (1 3 5 7 ELISP> (filter #'evenp '(1 2 3 4 5 6 7 8)) (2 4 6 8) ELISP> (filter #'oddp '(1 2 3 4 5 6 7 8)) (1 3 5 7)
Convert Infix Operator to prefix operator
(defmacro $ (a op b) `(,op ,a ,b)) ELISP> ELISP> ($ 1 < 10) t ELISP> ($ 1 > 10) nil ELISP> ELISP> (macroexpand '($ 1 > 10)) (> 1 10) ELISP> (if ($ 4 < 10) "Less than 10" "Greater than 10") "Less than 10" ELISP> ELISP> (if ($ 1444 < 10) "Less than 10" "Greater than 10") "Greater than 10" ELISP>
Debug Injection Macro
The function print can be replaced by message to display the debug message in the minibuffer. It is useful to debug callbacks.
(defmacro $debug (func &rest params) `(let ((__r (,func ,@params))) (progn (print (format "%s = %s" (quote (,func ,@params)) __r)) __r))) ELISP> ($debug + 10 ($debug * 10 30)) "(* 10 30) = 300" "(+ 10 ($debug * 10 30)) = 310" 310 ELISP>
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4