diff options
| author | Stefan Monnier | 2012-07-10 07:27:27 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2012-07-10 07:27:27 -0400 |
| commit | 2519d43af2534242f5b9cb393dc0d41eff95c9ac (patch) | |
| tree | b54f1fabf307d40edcae14d0040e1d4ee22facd8 | |
| parent | 02bd72573bef39cf345c0b0a945b6bb739dda67d (diff) | |
| download | emacs-2519d43af2534242f5b9cb393dc0d41eff95c9ac.tar.gz emacs-2519d43af2534242f5b9cb393dc0d41eff95c9ac.zip | |
* lisp/emacs-lisp/gv.el (cond): Make it a valid place.
(if): Simplify slightly.
| -rw-r--r-- | lisp/ChangeLog | 3 | ||||
| -rw-r--r-- | lisp/emacs-lisp/gv.el | 64 |
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 @@ | |||
| 1 | 2012-07-10 Stefan Monnier <monnier@iro.umontreal.ca> | 1 | 2012-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 | ||