aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2012-07-10 07:27:27 -0400
committerStefan Monnier2012-07-10 07:27:27 -0400
commit2519d43af2534242f5b9cb393dc0d41eff95c9ac (patch)
treeb54f1fabf307d40edcae14d0040e1d4ee22facd8
parent02bd72573bef39cf345c0b0a945b6bb739dda67d (diff)
downloademacs-2519d43af2534242f5b9cb393dc0d41eff95c9ac.tar.gz
emacs-2519d43af2534242f5b9cb393dc0d41eff95c9ac.zip
* lisp/emacs-lisp/gv.el (cond): Make it a valid place.
(if): Simplify slightly.
-rw-r--r--lisp/ChangeLog3
-rw-r--r--lisp/emacs-lisp/gv.el64
2 files changed, 51 insertions, 16 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index dbe46c66d50..a441bd0456f 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,5 +1,8 @@
12012-07-10 Stefan Monnier <monnier@iro.umontreal.ca> 12012-07-10 Stefan Monnier <monnier@iro.umontreal.ca>
2 2
3 * emacs-lisp/gv.el (cond): Make it a valid place.
4 (if): Simplify slightly.
5
3 * emacs-lisp/pcase.el (pcase): Accept self-quoting exps as "upatterns". 6 * emacs-lisp/pcase.el (pcase): Accept self-quoting exps as "upatterns".
4 (pcase--self-quoting-p): New function. 7 (pcase--self-quoting-p): New function.
5 (pcase--u1): Use it. 8 (pcase--u1): Use it.
diff --git a/lisp/emacs-lisp/gv.el b/lisp/emacs-lisp/gv.el
index 147ae5d4870..eb0e64e22b8 100644
--- a/lisp/emacs-lisp/gv.el
+++ b/lisp/emacs-lisp/gv.el
@@ -361,22 +361,54 @@ The return value is the last VAL in the list.
361 361
362(put 'if 'gv-expander 362(put 'if 'gv-expander
363 (lambda (do test then &rest else) 363 (lambda (do test then &rest else)
364 (let ((v (make-symbol "v"))) 364 (if (macroexp-small-p (funcall do 'dummy (lambda (_) 'dummy)))
365 (if (macroexp-small-p (funcall do 'dummy (lambda (_) 'dummy))) 365 ;; This duplicates the `do' code, which is a problem if that
366 ;; This duplicates the `do' code, which is a problem if that 366 ;; code is large, but otherwise results in more efficient code.
367 ;; code is large, but otherwise results in more efficient code. 367 `(if ,test ,(gv-get then do)
368 `(if ,test ,(gv-get then do) 368 ,@(macroexp-unprogn (gv-get (macroexp-progn else) do)))
369 ,@(macroexp-unprogn (gv-get (macroexp-progn else) do))) 369 (let ((v (make-symbol "v")))
370 (macroexp-let2 nil b test 370 (macroexp-let2 nil
371 (macroexp-let2 nil 371 gv `(if ,test ,(gv-letplace (getter setter) then
372 gv `(if ,b ,(gv-letplace (getter setter) then 372 `(cons (lambda () ,getter)
373 `(cons (lambda () ,getter) 373 (lambda (,v) ,(funcall setter v))))
374 (lambda (,v) ,(funcall setter v)))) 374 ,(gv-letplace (getter setter) (macroexp-progn else)
375 ,(gv-letplace (getter setter) (macroexp-progn else) 375 `(cons (lambda () ,getter)
376 `(cons (lambda () ,getter) 376 (lambda (,v) ,(funcall setter v)))))
377 (lambda (,v) ,(funcall setter v))))) 377 (funcall do `(funcall (car ,gv))
378 (funcall do `(funcall (car ,gv)) 378 (lambda (v) `(funcall (cdr ,gv) ,v))))))))
379 (lambda (v) `(funcall (cdr ,gv) ,v))))))))) 379
380(put 'cond 'gv-expander
381 (lambda (do &rest branches)
382 (if (macroexp-small-p (funcall do 'dummy (lambda (_) 'dummy)))
383 ;; This duplicates the `do' code, which is a problem if that
384 ;; code is large, but otherwise results in more efficient code.
385 `(cond
386 ,@(mapcar (lambda (branch)
387 (if (cdr branch)
388 (cons (car branch)
389 (macroexp-unprogn
390 (gv-get (macroexp-progn (cdr branch)) do)))
391 (gv-get (car branch) do)))
392 branches))
393 (let ((v (make-symbol "v")))
394 (macroexp-let2 nil
395 gv `(cond
396 ,@(mapcar
397 (lambda (branch)
398 (if (cdr branch)
399 `(,(car branch)
400 ,@(macroexp-unprogn
401 (gv-letplace (getter setter)
402 (macroexp-progn (cdr branch))
403 `(cons (lambda () ,getter)
404 (lambda (,v) ,(funcall setter v))))))
405 (gv-letplace (getter setter)
406 (car branch)
407 `(cons (lambda () ,getter)
408 (lambda (,v) ,(funcall setter v))))))
409 branches))
410 (funcall do `(funcall (car ,gv))
411 (lambda (v) `(funcall (cdr ,gv) ,v))))))))
380 412
381;;; Even more debatable extensions. 413;;; Even more debatable extensions.
382 414