comparison lisp/cl-macs.el @ 380:8626e4521993 r21-2-5

Import from CVS: tag r21-2-5
author cvs
date Mon, 13 Aug 2007 11:07:10 +0200
parents 6240c7796c7a
children aabb7f5b1c81
comparison
equal deleted inserted replaced
379:76b7d63099ad 380:8626e4521993
76 (require 76 (require
77 (progn 77 (progn
78 (or (fboundp 'defalias) (fset 'defalias 'fset)) 78 (or (fboundp 'defalias) (fset 'defalias 'fset))
79 (or (fboundp 'cl-transform-function-property) 79 (or (fboundp 'cl-transform-function-property)
80 (defalias 'cl-transform-function-property 80 (defalias 'cl-transform-function-property
81 (function (lambda (n p f) 81 #'(lambda (n p f)
82 (list 'put (list 'quote n) (list 'quote p) 82 (list 'put (list 'quote n) (list 'quote p)
83 (list 'function (cons 'lambda f))))))) 83 (list 'function (cons 'lambda f))))))
84 (car (or features (setq features (list 'cl-kludge)))))) 84 (car (or features (setq features (list 'cl-kludge))))))
85 85
86 86
87 ;;; Initialization. 87 ;;; Initialization.
88 88
95 ;;;###autoload 95 ;;;###autoload
96 (defun cl-compile-time-init () 96 (defun cl-compile-time-init ()
97 (setq cl-old-bc-file-form (symbol-function 'byte-compile-file-form)) 97 (setq cl-old-bc-file-form (symbol-function 'byte-compile-file-form))
98 (or (fboundp 'byte-compile-flush-pending) ; Emacs 19 compiler? 98 (or (fboundp 'byte-compile-flush-pending) ; Emacs 19 compiler?
99 (defalias 'byte-compile-file-form 99 (defalias 'byte-compile-file-form
100 (function 100 #'(lambda (form)
101 (lambda (form) 101 (setq form (macroexpand form byte-compile-macro-environment))
102 (setq form (macroexpand form byte-compile-macro-environment)) 102 (if (eq (car-safe form) 'progn)
103 (if (eq (car-safe form) 'progn) 103 (cons 'progn (mapcar 'byte-compile-file-form (cdr form)))
104 (cons 'progn (mapcar 'byte-compile-file-form (cdr form))) 104 (funcall cl-old-bc-file-form form)))))
105 (funcall cl-old-bc-file-form form))))))
106 (put 'eql 'byte-compile 'cl-byte-compile-compiler-macro) 105 (put 'eql 'byte-compile 'cl-byte-compile-compiler-macro)
107 (run-hooks 'cl-hack-bytecomp-hook)) 106 (run-hooks 'cl-hack-bytecomp-hook))
108 107
109 108
110 ;;; Symbols. 109 ;;; Symbols.
453 (head-list nil) 452 (head-list nil)
454 (last-clause (car (last clauses))) 453 (last-clause (car (last clauses)))
455 (body (cons 454 (body (cons
456 'cond 455 'cond
457 (mapcar 456 (mapcar
458 (function 457 #'(lambda (c)
459 (lambda (c) 458 (cons (cond ((memq (car c) '(t otherwise))
460 (cons (cond ((memq (car c) '(t otherwise)) 459 (or (eq c last-clause)
461 (or (eq c last-clause) 460 (error
462 (error 461 "`%s' is allowed only as the last case clause"
463 "`%s' is allowed only as the last case clause" 462 (car c)))
464 (car c))) 463 t)
465 t) 464 ((eq (car c) 'ecase-error-flag)
466 ((eq (car c) 'ecase-error-flag) 465 (list 'error "ecase failed: %s, %s"
467 (list 'error "ecase failed: %s, %s" 466 temp (list 'quote (reverse head-list))))
468 temp (list 'quote (reverse head-list)))) 467 ((listp (car c))
469 ((listp (car c)) 468 (setq head-list (append (car c) head-list))
470 (setq head-list (append (car c) head-list)) 469 (list 'member* temp (list 'quote (car c))))
471 (list 'member* temp (list 'quote (car c)))) 470 (t
472 (t 471 (if (memq (car c) head-list)
473 (if (memq (car c) head-list) 472 (error "Duplicate key in case: %s"
474 (error "Duplicate key in case: %s" 473 (car c)))
475 (car c))) 474 (cl-push (car c) head-list)
476 (cl-push (car c) head-list) 475 (list 'eql temp (list 'quote (car c)))))
477 (list 'eql temp (list 'quote (car c))))) 476 (or (cdr c) '(nil))))
478 (or (cdr c) '(nil)))))
479 clauses)))) 477 clauses))))
480 (if (eq temp expr) body 478 (if (eq temp expr) body
481 (list 'let (list (list temp expr)) body)))) 479 (list 'let (list (list temp expr)) body))))
482 480
483 ;; #### CL standard also requires `ccase', which signals a continuable 481 ;; #### CL standard also requires `ccase', which signals a continuable
505 (let* ((temp (if (cl-simple-expr-p expr 3) expr (gensym))) 503 (let* ((temp (if (cl-simple-expr-p expr 3) expr (gensym)))
506 (type-list nil) 504 (type-list nil)
507 (body (cons 505 (body (cons
508 'cond 506 'cond
509 (mapcar 507 (mapcar
510 (function 508 #'(lambda (c)
511 (lambda (c) 509 (cons (cond ((eq (car c) 'otherwise) t)
512 (cons (cond ((eq (car c) 'otherwise) t) 510 ((eq (car c) 'ecase-error-flag)
513 ((eq (car c) 'ecase-error-flag) 511 (list 'error "etypecase failed: %s, %s"
514 (list 'error "etypecase failed: %s, %s" 512 temp (list 'quote (reverse type-list))))
515 temp (list 'quote (reverse type-list)))) 513 (t
516 (t 514 (cl-push (car c) type-list)
517 (cl-push (car c) type-list) 515 (cl-make-type-test temp (car c))))
518 (cl-make-type-test temp (car c)))) 516 (or (cdr c) '(nil))))
519 (or (cdr c) '(nil)))))
520 clauses)))) 517 clauses))))
521 (if (eq temp expr) body 518 (if (eq temp expr) body
522 (list 'let (list (list temp expr)) body)))) 519 (list 'let (list (list temp expr)) body))))
523 520
524 ;;;###autoload 521 ;;;###autoload
1163 (cl-expand-do-loop steps endtest body t)) 1160 (cl-expand-do-loop steps endtest body t))
1164 1161
1165 (defun cl-expand-do-loop (steps endtest body star) 1162 (defun cl-expand-do-loop (steps endtest body star)
1166 (list 'block nil 1163 (list 'block nil
1167 (list* (if star 'let* 'let) 1164 (list* (if star 'let* 'let)
1168 (mapcar (function (lambda (c) 1165 (mapcar #'(lambda (c) (if (consp c) (list (car c) (nth 1 c)) c))
1169 (if (consp c) (list (car c) (nth 1 c)) c)))
1170 steps) 1166 steps)
1171 (list* 'while (list 'not (car endtest)) 1167 (list* 'while (list 'not (car endtest))
1172 (append body 1168 (append body
1173 (let ((sets (mapcar 1169 (let ((sets (mapcar
1174 (function 1170 #'(lambda (c)
1175 (lambda (c) 1171 (and (consp c) (cdr (cdr c))
1176 (and (consp c) (cdr (cdr c)) 1172 (list (car c) (nth 2 c))))
1177 (list (car c) (nth 2 c)))))
1178 steps))) 1173 steps)))
1179 (setq sets (delq nil sets)) 1174 (setq sets (delq nil sets))
1180 (and sets 1175 (and sets
1181 (list (cons (if (or star (not (cdr sets))) 1176 (list (cons (if (or star (not (cdr sets)))
1182 'setq 'psetq) 1177 'setq 'psetq)
1262 rather than its value cell. The FORMs are evaluated with the specified 1257 rather than its value cell. The FORMs are evaluated with the specified
1263 function definitions in place, then the definitions are undone (the FUNCs 1258 function definitions in place, then the definitions are undone (the FUNCs
1264 go back to their previous definitions, or lack thereof)." 1259 go back to their previous definitions, or lack thereof)."
1265 (list* 'letf* 1260 (list* 'letf*
1266 (mapcar 1261 (mapcar
1267 (function 1262 #'(lambda (x)
1268 (lambda (x) 1263 (if (or (and (fboundp (car x))
1269 (if (or (and (fboundp (car x)) 1264 (eq (car-safe (symbol-function (car x))) 'macro))
1270 (eq (car-safe (symbol-function (car x))) 'macro)) 1265 (cdr (assq (car x) cl-macro-environment)))
1271 (cdr (assq (car x) cl-macro-environment))) 1266 (error "Use `labels', not `flet', to rebind macro names"))
1272 (error "Use `labels', not `flet', to rebind macro names")) 1267 (let ((func (list 'function*
1273 (let ((func (list 'function* 1268 (list 'lambda (cadr x)
1274 (list 'lambda (cadr x) 1269 (list* 'block (car x) (cddr x))))))
1275 (list* 'block (car x) (cddr x)))))) 1270 (if (and (cl-compiling-file)
1276 (if (and (cl-compiling-file) 1271 (boundp 'byte-compile-function-environment))
1277 (boundp 'byte-compile-function-environment)) 1272 (cl-push (cons (car x) (eval func))
1278 (cl-push (cons (car x) (eval func)) 1273 byte-compile-function-environment))
1279 byte-compile-function-environment)) 1274 (list (list 'symbol-function (list 'quote (car x))) func)))
1280 (list (list 'symbol-function (list 'quote (car x))) func))))
1281 bindings) 1275 bindings)
1282 body)) 1276 body))
1283 1277
1284 ;;;###autoload 1278 ;;;###autoload
1285 (defmacro labels (bindings &rest body) 1279 (defmacro labels (bindings &rest body)
1286 "(labels ((FUNC ARGLIST BODY...) ...) FORM...): make temporary func bindings. 1280 "(labels ((FUNC ARGLIST BODY...) ...) FORM...): make temporary func bindings.
1287 This is like `flet', except the bindings are lexical instead of dynamic. 1281 This is like `flet', except the bindings are lexical instead of dynamic.
1288 Unlike `flet', this macro is fully complaint with the Common Lisp standard." 1282 Unlike `flet', this macro is fully compliant with the Common Lisp standard."
1289 (let ((vars nil) (sets nil) (cl-macro-environment cl-macro-environment)) 1283 (let ((vars nil) (sets nil) (cl-macro-environment cl-macro-environment))
1290 (while bindings 1284 (while bindings
1291 (let ((var (gensym))) 1285 (let ((var (gensym)))
1292 (cl-push var vars) 1286 (cl-push var vars)
1293 (cl-push (list 'function* (cons 'lambda (cdar bindings))) sets) 1287 (cl-push (list 'function* (cons 'lambda (cdar bindings))) sets)
1335 (defmacro lexical-let (bindings &rest body) 1329 (defmacro lexical-let (bindings &rest body)
1336 "(lexical-let BINDINGS BODY...): like `let', but lexically scoped. 1330 "(lexical-let BINDINGS BODY...): like `let', but lexically scoped.
1337 The main visible difference is that lambdas inside BODY will create 1331 The main visible difference is that lambdas inside BODY will create
1338 lexical closures as in Common Lisp." 1332 lexical closures as in Common Lisp."
1339 (let* ((cl-closure-vars cl-closure-vars) 1333 (let* ((cl-closure-vars cl-closure-vars)
1340 (vars (mapcar (function 1334 (vars (mapcar #'(lambda (x)
1341 (lambda (x) 1335 (or (consp x) (setq x (list x)))
1342 (or (consp x) (setq x (list x))) 1336 (cl-push (gensym (format "--%s--" (car x)))
1343 (cl-push (gensym (format "--%s--" (car x))) 1337 cl-closure-vars)
1344 cl-closure-vars) 1338 (list (car x) (cadr x) (car cl-closure-vars)))
1345 (list (car x) (cadr x) (car cl-closure-vars))))
1346 bindings)) 1339 bindings))
1347 (ebody 1340 (ebody
1348 (cl-macroexpand-all 1341 (cl-macroexpand-all
1349 (cons 'progn body) 1342 (cons 'progn body)
1350 (nconc (mapcar (function (lambda (x) 1343 (nconc (mapcar #'(lambda (x)
1351 (list (symbol-name (car x)) 1344 (list (symbol-name (car x))
1352 (list 'symbol-value (caddr x)) 1345 (list 'symbol-value (caddr x))
1353 t))) vars) 1346 t))
1347 vars)
1354 (list '(defun . cl-defun-expander)) 1348 (list '(defun . cl-defun-expander))
1355 cl-macro-environment)))) 1349 cl-macro-environment))))
1356 (if (not (get (car (last cl-closure-vars)) 'used)) 1350 (if (not (get (car (last cl-closure-vars)) 'used))
1357 (list 'let (mapcar (function (lambda (x) 1351 (list 'let (mapcar #'(lambda (x) (list (caddr x) (cadr x))) vars)
1358 (list (caddr x) (cadr x)))) vars) 1352 (sublis (mapcar #'(lambda (x)
1359 (sublis (mapcar (function (lambda (x) 1353 (cons (caddr x) (list 'quote (caddr x))))
1360 (cons (caddr x)
1361 (list 'quote (caddr x)))))
1362 vars) 1354 vars)
1363 ebody)) 1355 ebody))
1364 (list 'let (mapcar (function (lambda (x) 1356 (list 'let (mapcar #'(lambda (x)
1365 (list (caddr x) 1357 (list (caddr x)
1366 (list 'make-symbol 1358 (list 'make-symbol
1367 (format "--%s--" (car x)))))) 1359 (format "--%s--" (car x)))))
1368 vars) 1360 vars)
1369 (apply 'append '(setf) 1361 (apply 'append '(setf)
1370 (mapcar (function 1362 (mapcar #'(lambda (x)
1371 (lambda (x) 1363 (list (list 'symbol-value (caddr x)) (cadr x)))
1372 (list (list 'symbol-value (caddr x)) (cadr x))))
1373 vars)) 1364 vars))
1374 ebody)))) 1365 ebody))))
1375 1366
1376 ;;;###autoload 1367 ;;;###autoload
1377 (defmacro lexical-let* (bindings &rest body) 1368 (defmacro lexical-let* (bindings &rest body)
1401 is analogous to the Common Lisp `multiple-value-bind' macro, using lists to 1392 is analogous to the Common Lisp `multiple-value-bind' macro, using lists to
1402 simulate true multiple return values. For compatibility, (values A B C) is 1393 simulate true multiple return values. For compatibility, (values A B C) is
1403 a synonym for (list A B C)." 1394 a synonym for (list A B C)."
1404 (let ((temp (gensym)) (n -1)) 1395 (let ((temp (gensym)) (n -1))
1405 (list* 'let* (cons (list temp form) 1396 (list* 'let* (cons (list temp form)
1406 (mapcar (function 1397 (mapcar #'(lambda (v)
1407 (lambda (v) 1398 (list v (list 'nth (setq n (1+ n)) temp)))
1408 (list v (list 'nth (setq n (1+ n)) temp))))
1409 vars)) 1399 vars))
1410 body))) 1400 body)))
1411 1401
1412 ;;;###autoload 1402 ;;;###autoload
1413 (defmacro multiple-value-setq (vars form) 1403 (defmacro multiple-value-setq (vars form)
1420 ((null (cdr vars)) (list 'setq (car vars) (list 'car form))) 1410 ((null (cdr vars)) (list 'setq (car vars) (list 'car form)))
1421 (t 1411 (t
1422 (let* ((temp (gensym)) (n 0)) 1412 (let* ((temp (gensym)) (n 0))
1423 (list 'let (list (list temp form)) 1413 (list 'let (list (list temp form))
1424 (list 'prog1 (list 'setq (cl-pop vars) (list 'car temp)) 1414 (list 'prog1 (list 'setq (cl-pop vars) (list 'car temp))
1425 (cons 'setq (apply 'nconc 1415 (cons 'setq
1426 (mapcar (function 1416 (apply 'nconc
1427 (lambda (v) 1417 (mapcar
1428 (list v (list 1418 #'(lambda (v)
1429 'nth 1419 (list v (list
1430 (setq n (1+ n)) 1420 'nth
1431 temp)))) 1421 (setq n (1+ n))
1432 vars))))))))) 1422 temp)))
1423 vars)))))))))
1433 1424
1434 1425
1435 ;;; Declarations. 1426 ;;; Declarations.
1436 1427
1437 ;;;###autoload 1428 ;;;###autoload
1446 (and hist (listp cl-proclaim-history) (cl-push spec cl-proclaim-history)) 1437 (and hist (listp cl-proclaim-history) (cl-push spec cl-proclaim-history))
1447 (cond ((eq (car-safe spec) 'special) 1438 (cond ((eq (car-safe spec) 'special)
1448 (if (boundp 'byte-compile-bound-variables) 1439 (if (boundp 'byte-compile-bound-variables)
1449 (setq byte-compile-bound-variables 1440 (setq byte-compile-bound-variables
1450 ;; todo: this should compute correct binding bits vs. 0 1441 ;; todo: this should compute correct binding bits vs. 0
1451 (append (mapcar #'(lambda (v) (cons v 0)) 1442 (append (mapcar #'(lambda (v) (cons v 0))
1452 (cdr spec)) 1443 (cdr spec))
1453 byte-compile-bound-variables)))) 1444 byte-compile-bound-variables))))
1454 1445
1455 ((eq (car-safe spec) 'inline) 1446 ((eq (car-safe spec) 'inline)
1456 (while (setq spec (cdr spec)) 1447 (while (setq spec (cdr spec))
1602 (if (car args) 1593 (if (car args)
1603 (list 'list '(quote progn) call 'store) 1594 (list 'list '(quote progn) call 'store)
1604 call))))) 1595 call)))))
1605 1596
1606 ;;; Some standard place types from Common Lisp. 1597 ;;; Some standard place types from Common Lisp.
1598 (eval-when-compile (defvar ignored-arg)) ; Warning suppression
1607 (defsetf aref aset) 1599 (defsetf aref aset)
1608 (defsetf car setcar) 1600 (defsetf car setcar)
1609 (defsetf cdr setcdr) 1601 (defsetf cdr setcdr)
1610 (defsetf elt (seq n) (store) 1602 (defsetf elt (seq n) (store)
1611 (list 'if (list 'listp seq) (list 'setcar (list 'nthcdr n seq) store) 1603 (list 'if (list 'listp seq) (list 'setcar (list 'nthcdr n seq) store)
1612 (list 'aset seq n store))) 1604 (list 'aset seq n store)))
1613 (defsetf get (x y &optional d) (store) (list 'put x y store)) 1605 (defsetf get (x y &optional ignored-arg) (store) (list 'put x y store))
1614 (defsetf get* (x y &optional d) (store) (list 'put x y store)) 1606 (defsetf get* (x y &optional ignored-arg) (store) (list 'put x y store))
1615 (defsetf gethash (x h &optional d) (store) (list 'cl-puthash x store h)) 1607 (defsetf gethash (x h &optional ignored-arg) (store) (list 'cl-puthash x store h))
1616 (defsetf nth (n x) (store) (list 'setcar (list 'nthcdr n x) store)) 1608 (defsetf nth (n x) (store) (list 'setcar (list 'nthcdr n x) store))
1617 (defsetf subseq (seq start &optional end) (new) 1609 (defsetf subseq (seq start &optional end) (new)
1618 (list 'progn (list 'replace seq new ':start1 start ':end1 end) new)) 1610 (list 'progn (list 'replace seq new ':start1 start ':end1 end) new))
1619 (defsetf symbol-function fset) 1611 (defsetf symbol-function fset)
1620 (defsetf symbol-plist setplist) 1612 (defsetf symbol-plist setplist)
1651 (defsetf default-file-modes set-default-file-modes t) 1643 (defsetf default-file-modes set-default-file-modes t)
1652 (defsetf default-value set-default) 1644 (defsetf default-value set-default)
1653 (defsetf documentation-property put) 1645 (defsetf documentation-property put)
1654 (defsetf extent-face set-extent-face) 1646 (defsetf extent-face set-extent-face)
1655 (defsetf extent-priority set-extent-priority) 1647 (defsetf extent-priority set-extent-priority)
1656 (defsetf extent-property (x y &optional d) (arg) 1648 (defsetf extent-property (x y &optional ignored-arg) (arg)
1657 (list 'set-extent-property x y arg)) 1649 (list 'set-extent-property x y arg))
1658 (defsetf extent-end-position (ext) (store) 1650 (defsetf extent-end-position (ext) (store)
1659 (list 'progn (list 'set-extent-endpoints (list 'extent-start-position ext) 1651 (list 'progn (list 'set-extent-endpoints (list 'extent-start-position ext)
1660 store) store)) 1652 store) store))
1661 (defsetf extent-start-position (ext) (store) 1653 (defsetf extent-start-position (ext) (store)
1671 (defsetf file-modes set-file-modes t) 1663 (defsetf file-modes set-file-modes t)
1672 (defsetf frame-parameters modify-frame-parameters t) 1664 (defsetf frame-parameters modify-frame-parameters t)
1673 (defsetf frame-visible-p cl-set-frame-visible-p) 1665 (defsetf frame-visible-p cl-set-frame-visible-p)
1674 (defsetf frame-properties (&optional f) (p) 1666 (defsetf frame-properties (&optional f) (p)
1675 `(progn (set-frame-properties ,f ,p) ,p)) 1667 `(progn (set-frame-properties ,f ,p) ,p))
1676 (defsetf frame-property (f p &optional d) (v) 1668 (defsetf frame-property (f p &optional ignored-arg) (v)
1677 `(progn (set-frame-property ,f ,v) ,p)) 1669 `(progn (set-frame-property ,f ,v) ,p))
1678 (defsetf frame-width (&optional f) (v) 1670 (defsetf frame-width (&optional f) (v)
1679 `(progn (set-frame-width ,f ,v) ,v)) 1671 `(progn (set-frame-width ,f ,v) ,v))
1680 (defsetf frame-height (&optional f) (v) 1672 (defsetf frame-height (&optional f) (v)
1681 `(progn (set-frame-height ,f ,v) ,v)) 1673 `(progn (set-frame-height ,f ,v) ,v))
1706 (defsetf widget-get widget-put t) 1698 (defsetf widget-get widget-put t)
1707 (defsetf widget-value widget-value-set t) 1699 (defsetf widget-value widget-value-set t)
1708 1700
1709 ;; Misc 1701 ;; Misc
1710 (defsetf recent-keys-ring-size set-recent-keys-ring-size) 1702 (defsetf recent-keys-ring-size set-recent-keys-ring-size)
1711 (defsetf symbol-value-in-buffer (s b &optional u) (store) 1703 (defsetf symbol-value-in-buffer (s b &optional ignored-arg) (store)
1712 `(with-current-buffer ,b (set ,s ,store))) 1704 `(with-current-buffer ,b (set ,s ,store)))
1713 (defsetf symbol-value-in-console (s c &optional u) (store) 1705 (defsetf symbol-value-in-console (s c &optional ignored-arg) (store)
1714 `(letf (((selected-console) ,c)) 1706 `(letf (((selected-console) ,c))
1715 (set ,s ,store))) 1707 (set ,s ,store)))
1716 1708
1717 (defsetf buffer-dedicated-frame (&optional b) (v) 1709 (defsetf buffer-dedicated-frame (&optional b) (v)
1718 `(set-buffer-dedicated-frame ,b ,v)) 1710 `(set-buffer-dedicated-frame ,b ,v))
1742 (defsetf itimer-value set-itimer-value) 1734 (defsetf itimer-value set-itimer-value)
1743 (defsetf keymap-parents set-keymap-parents) 1735 (defsetf keymap-parents set-keymap-parents)
1744 (defsetf marker-insertion-type set-marker-insertion-type) 1736 (defsetf marker-insertion-type set-marker-insertion-type)
1745 (defsetf mouse-pixel-position (&optional d) (v) 1737 (defsetf mouse-pixel-position (&optional d) (v)
1746 `(progn 1738 `(progn
1747 set-mouse-pixel-position ,d ,(car v) ,(car (cdr v)) ,(cdr (cdr v)) 1739 (set-mouse-pixel-position ,d ,(car v) ,(car (cdr v)) ,(cdr (cdr v)))
1748 ,v)) 1740 ,v))
1749 (defsetf trunc-stack-length set-trunc-stack-length) 1741 (defsetf trunc-stack-length set-trunc-stack-length)
1750 (defsetf trunc-stack-stack set-trunc-stack-stack) 1742 (defsetf trunc-stack-stack set-trunc-stack-stack)
1751 (defsetf undoable-stack-max set-undoable-stack-max) 1743 (defsetf undoable-stack-max set-undoable-stack-max)
1752 (defsetf weak-list-list set-weak-list-list) 1744 (defsetf weak-list-list set-weak-list-list)
1789 (defsetf syntax-table set-syntax-table) 1781 (defsetf syntax-table set-syntax-table)
1790 (defsetf visited-file-modtime set-visited-file-modtime t) 1782 (defsetf visited-file-modtime set-visited-file-modtime t)
1791 (defsetf window-buffer set-window-buffer t) 1783 (defsetf window-buffer set-window-buffer t)
1792 (defsetf window-display-table set-window-display-table t) 1784 (defsetf window-display-table set-window-display-table t)
1793 (defsetf window-dedicated-p set-window-dedicated-p t) 1785 (defsetf window-dedicated-p set-window-dedicated-p t)
1794 (defsetf window-height () (store) 1786 (defsetf window-height (&optional window) (store)
1795 (list 'progn (list 'enlarge-window (list '- store '(window-height))) store)) 1787 `(progn (enlarge-window (- ,store (window-height)) nil ,window) ,store))
1796 (defsetf window-hscroll set-window-hscroll) 1788 (defsetf window-hscroll set-window-hscroll)
1797 (defsetf window-point set-window-point) 1789 (defsetf window-point set-window-point)
1798 (defsetf window-start set-window-start) 1790 (defsetf window-start set-window-start)
1799 (defsetf window-width () (store) 1791 (defsetf window-width (&optional window) (store)
1800 (list 'progn (list 'enlarge-window (list '- store '(window-width)) t) store)) 1792 `(progn (enlarge-window (- ,store (window-width)) t ,window) ,store))
1801 (defsetf x-get-cutbuffer x-store-cutbuffer t) 1793 (defsetf x-get-cutbuffer x-store-cutbuffer t)
1802 (defsetf x-get-cut-buffer x-store-cut-buffer t) ; groan. 1794 (defsetf x-get-cut-buffer x-store-cut-buffer t) ; groan.
1803 (defsetf x-get-secondary-selection x-own-secondary-selection t) 1795 (defsetf x-get-secondary-selection x-own-secondary-selection t)
1804 (defsetf x-get-selection x-own-selection t) 1796 (defsetf x-get-selection x-own-selection t)
1805 1797
2078 values. Note that this macro is *not* available in Common Lisp. 2070 values. Note that this macro is *not* available in Common Lisp.
2079 As a special case, if `(PLACE)' is used instead of `(PLACE VALUE)', 2071 As a special case, if `(PLACE)' is used instead of `(PLACE VALUE)',
2080 the PLACE is not modified before executing BODY." 2072 the PLACE is not modified before executing BODY."
2081 (if (and (not (cdr bindings)) (cdar bindings) (symbolp (caar bindings))) 2073 (if (and (not (cdr bindings)) (cdar bindings) (symbolp (caar bindings)))
2082 (list* 'let bindings body) 2074 (list* 'let bindings body)
2083 (let ((lets nil) (sets nil) 2075 (let ((lets nil)
2084 (unsets nil) (rev (reverse bindings))) 2076 (rev (reverse bindings)))
2085 (while rev 2077 (while rev
2086 (let* ((place (if (symbolp (caar rev)) 2078 (let* ((place (if (symbolp (caar rev))
2087 (list 'symbol-value (list 'quote (caar rev))) 2079 (list 'symbol-value (list 'quote (caar rev)))
2088 (caar rev))) 2080 (caar rev)))
2089 (value (cadar rev)) 2081 (value (cadar rev))
2202 (safety (if (cl-compiling-file) cl-optimize-safety 3)) 2194 (safety (if (cl-compiling-file) cl-optimize-safety 3))
2203 (include nil) 2195 (include nil)
2204 (tag (intern (format "cl-struct-%s" name))) 2196 (tag (intern (format "cl-struct-%s" name)))
2205 (tag-symbol (intern (format "cl-struct-%s-tags" name))) 2197 (tag-symbol (intern (format "cl-struct-%s-tags" name)))
2206 (include-descs nil) 2198 (include-descs nil)
2207 ;; XEmacs change
2208 (include-tag-symbol nil)
2209 (side-eff nil) 2199 (side-eff nil)
2210 (type nil) 2200 (type nil)
2211 (named nil) 2201 (named nil)
2212 (forms nil) 2202 (forms nil)
2213 pred-form pred-check) 2203 pred-form pred-check)
2214 (if (stringp (car descs)) 2204 (if (stringp (car descs))
2215 (cl-push (list 'put (list 'quote name) '(quote structure-documentation) 2205 (cl-push (list 'put (list 'quote name) '(quote structure-documentation)
2216 (cl-pop descs)) forms)) 2206 (cl-pop descs)) forms))
2217 (setq descs (cons '(cl-tag-slot) 2207 (setq descs (cons '(cl-tag-slot)
2218 (mapcar (function (lambda (x) (if (consp x) x (list x)))) 2208 (mapcar #'(lambda (x) (if (consp x) x (list x)))
2219 descs))) 2209 descs)))
2220 (while opts 2210 (while opts
2221 (let ((opt (if (consp (car opts)) (caar opts) (car opts))) 2211 (let ((opt (if (consp (car opts)) (caar opts) (car opts)))
2222 (args (cdr-safe (cl-pop opts)))) 2212 (args (cdr-safe (cl-pop opts))))
2223 (cond ((eq opt ':conc-name) 2213 (cond ((eq opt ':conc-name)
2232 (if args (setq copier (car args)))) 2222 (if args (setq copier (car args))))
2233 ((eq opt ':predicate) 2223 ((eq opt ':predicate)
2234 (if args (setq predicate (car args)))) 2224 (if args (setq predicate (car args))))
2235 ((eq opt ':include) 2225 ((eq opt ':include)
2236 (setq include (car args) 2226 (setq include (car args)
2237 include-descs (mapcar (function 2227 include-descs (mapcar #'(lambda (x)
2238 (lambda (x) 2228 (if (consp x) x (list x)))
2239 (if (consp x) x (list x)))) 2229 (cdr args))))
2240 (cdr args))
2241 ;; XEmacs change
2242 include-tag-symbol (intern (format "cl-struct-%s-tags"
2243 include))))
2244 ((eq opt ':print-function) 2230 ((eq opt ':print-function)
2245 (setq print-func (car args))) 2231 (setq print-func (car args)))
2246 ((eq opt ':type) 2232 ((eq opt ':type)
2247 (setq type (car args))) 2233 (setq type (car args)))
2248 ((eq opt ':named) 2234 ((eq opt ':named)
2368 constrs)) 2354 constrs))
2369 (while constrs 2355 (while constrs
2370 (let* ((name (caar constrs)) 2356 (let* ((name (caar constrs))
2371 (args (cadr (cl-pop constrs))) 2357 (args (cadr (cl-pop constrs)))
2372 (anames (cl-arglist-args args)) 2358 (anames (cl-arglist-args args))
2373 (make (mapcar* (function (lambda (s d) (if (memq s anames) s d))) 2359 (make (mapcar* #'(lambda (s d) (if (memq s anames) s d))
2374 slots defaults))) 2360 slots defaults)))
2375 (cl-push (list 'defsubst* name 2361 (cl-push (list 'defsubst* name
2376 (list* '&cl-defs (list 'quote (cons nil descs)) args) 2362 (list* '&cl-defs (list 'quote (cons nil descs)) args)
2377 (cons type make)) forms) 2363 (cons type make)) forms)
2378 (if (cl-safe-expr-p (cons 'progn (mapcar 'second descs))) 2364 (if (cl-safe-expr-p (cons 'progn (mapcar 'second descs)))
2392 (list 'quote (list type (eq named t)))) 2378 (list 'quote (list type (eq named t))))
2393 (list 'put (list 'quote name) '(quote cl-struct-include) 2379 (list 'put (list 'quote name) '(quote cl-struct-include)
2394 (list 'quote include)) 2380 (list 'quote include))
2395 (list 'put (list 'quote name) '(quote cl-struct-print) 2381 (list 'put (list 'quote name) '(quote cl-struct-print)
2396 print-auto) 2382 print-auto)
2397 (mapcar (function (lambda (x) 2383 (mapcar #'(lambda (x)
2398 (list 'put (list 'quote (car x)) 2384 (list 'put (list 'quote (car x))
2399 '(quote side-effect-free) 2385 '(quote side-effect-free)
2400 (list 'quote (cdr x))))) 2386 (list 'quote (cdr x))))
2401 side-eff)) 2387 side-eff))
2402 forms) 2388 forms)
2403 (cons 'progn (nreverse (cons (list 'quote name) forms))))) 2389 (cons 'progn (nreverse (cons (list 'quote name) forms)))))
2404 2390
2405 ;;;###autoload 2391 ;;;###autoload
2462 (if (memq (caddr type) '(* nil)) t 2448 (if (memq (caddr type) '(* nil)) t
2463 (if (consp (caddr type)) (list '< val (caaddr type)) 2449 (if (consp (caddr type)) (list '< val (caaddr type))
2464 (list '<= val (caddr type))))))) 2450 (list '<= val (caddr type)))))))
2465 ((memq (car-safe type) '(and or not)) 2451 ((memq (car-safe type) '(and or not))
2466 (cons (car type) 2452 (cons (car type)
2467 (mapcar (function (lambda (x) (cl-make-type-test val x))) 2453 (mapcar #'(lambda (x) (cl-make-type-test val x))
2468 (cdr type)))) 2454 (cdr type))))
2469 ((memq (car-safe type) '(member member*)) 2455 ((memq (car-safe type) '(member member*))
2470 (list 'and (list 'member* val (list 'quote (cdr type))) t)) 2456 (list 'and (list 'member* val (list 'quote (cdr type))) t))
2471 ((eq (car-safe type) 'satisfies) (list (cadr type) val)) 2457 ((eq (car-safe type) 'satisfies) (list (cadr type) val))
2472 (t (error "Bad type spec: %s" type))))) 2458 (t (error "Bad type spec: %s" type)))))
2499 They are not evaluated unless the assertion fails. If STRING is 2485 They are not evaluated unless the assertion fails. If STRING is
2500 omitted, a default message listing FORM itself is used." 2486 omitted, a default message listing FORM itself is used."
2501 (and (or (not (cl-compiling-file)) 2487 (and (or (not (cl-compiling-file))
2502 (< cl-optimize-speed 3) (= cl-optimize-safety 3)) 2488 (< cl-optimize-speed 3) (= cl-optimize-safety 3))
2503 (let ((sargs (and show-args (delq nil (mapcar 2489 (let ((sargs (and show-args (delq nil (mapcar
2504 (function 2490 #'(lambda (x)
2505 (lambda (x) 2491 (and (not (cl-const-expr-p x))
2506 (and (not (cl-const-expr-p x)) 2492 x))
2507 x))) (cdr form)))))) 2493 (cdr form))))))
2508 (list 'progn 2494 (list 'progn
2509 (list 'or form 2495 (list 'or form
2510 (if string 2496 (if string
2511 (list* 'error string (append sargs args)) 2497 (list* 'error string (append sargs args))
2512 (list 'signal '(quote cl-assertion-failed) 2498 (list 'signal '(quote cl-assertion-failed)
2515 2501
2516 ;;;###autoload 2502 ;;;###autoload
2517 (defmacro ignore-errors (&rest body) 2503 (defmacro ignore-errors (&rest body)
2518 "Execute FORMS; if an error occurs, return nil. 2504 "Execute FORMS; if an error occurs, return nil.
2519 Otherwise, return result of last FORM." 2505 Otherwise, return result of last FORM."
2520 (list 'condition-case nil (cons 'progn body) '(error nil))) 2506 `(condition-case nil (progn ,@body) (error nil)))
2521 2507
2508 ;;;###autoload
2509 (defmacro ignore-file-errors (&rest body)
2510 "Execute FORMS; if an error of type `file-error' occurs, return nil.
2511 Otherwise, return result of last FORM."
2512 `(condition-case nil (progn ,@body) (file-error nil)))
2522 2513
2523 ;;; Some predicates for analyzing Lisp forms. These are used by various 2514 ;;; Some predicates for analyzing Lisp forms. These are used by various
2524 ;;; macro expanders to optimize the results in certain common cases. 2515 ;;; macro expanders to optimize the results in certain common cases.
2525 2516
2526 (defconst cl-simple-funcs '(car cdr nth aref elt if and or + - 1+ 1- min max 2517 (defconst cl-simple-funcs '(car cdr nth aref elt if and or + - 1+ 1- min max
2670 2661
2671 (defun cl-defsubst-expand (argns body simple whole unsafe &rest argvs) 2662 (defun cl-defsubst-expand (argns body simple whole unsafe &rest argvs)
2672 (if (and whole (not (cl-safe-expr-p (cons 'progn argvs)))) whole 2663 (if (and whole (not (cl-safe-expr-p (cons 'progn argvs)))) whole
2673 (if (cl-simple-exprs-p argvs) (setq simple t)) 2664 (if (cl-simple-exprs-p argvs) (setq simple t))
2674 (let ((lets (delq nil 2665 (let ((lets (delq nil
2675 (mapcar* (function 2666 (mapcar* #'(lambda (argn argv)
2676 (lambda (argn argv) 2667 (if (or simple (cl-const-expr-p argv))
2677 (if (or simple (cl-const-expr-p argv)) 2668 (progn (setq body (subst argv argn body))
2678 (progn (setq body (subst argv argn body)) 2669 (and unsafe (list argn argv)))
2679 (and unsafe (list argn argv))) 2670 (list argn argv)))
2680 (list argn argv))))
2681 argns argvs)))) 2671 argns argvs))))
2682 (if lets (list 'let lets body) body)))) 2672 (if lets (list 'let lets body) body))))
2683 2673
2684 2674
2685 ;;; Compile-time optimizations for some functions defined in this package. 2675 ;;; Compile-time optimizations for some functions defined in this package.
2767 (let ((temp (gensym))) 2757 (let ((temp (gensym)))
2768 (list 'let (list (list temp val)) (subst temp val res))))) 2758 (list 'let (list (list temp val)) (subst temp val res)))))
2769 form)) 2759 form))
2770 2760
2771 2761
2772 (mapcar (function 2762 (mapc
2773 (lambda (y) 2763 #'(lambda (y)
2774 (put (car y) 'side-effect-free t) 2764 (put (car y) 'side-effect-free t)
2775 (put (car y) 'byte-compile 'cl-byte-compile-compiler-macro) 2765 (put (car y) 'byte-compile 'cl-byte-compile-compiler-macro)
2776 (put (car y) 'cl-compiler-macro 2766 (put (car y) 'cl-compiler-macro
2777 (list 'lambda '(w x) 2767 (list 'lambda '(w x)
2778 (if (symbolp (cadr y)) 2768 (if (symbolp (cadr y))
2779 (list 'list (list 'quote (cadr y)) 2769 (list 'list (list 'quote (cadr y))
2780 (list 'list (list 'quote (caddr y)) 'x)) 2770 (list 'list (list 'quote (caddr y)) 'x))
2781 (cons 'list (cdr y))))))) 2771 (cons 'list (cdr y))))))
2782 '((first 'car x) (second 'cadr x) (third 'caddr x) (fourth 'cadddr x) 2772 '((first 'car x) (second 'cadr x) (third 'caddr x) (fourth 'cadddr x)
2783 (fifth 'nth 4 x) (sixth 'nth 5 x) (seventh 'nth 6 x) 2773 (fifth 'nth 4 x) (sixth 'nth 5 x) (seventh 'nth 6 x)
2784 (eighth 'nth 7 x) (ninth 'nth 8 x) (tenth 'nth 9 x) 2774 (eighth 'nth 7 x) (ninth 'nth 8 x) (tenth 'nth 9 x)
2785 (rest 'cdr x) (endp 'null x) (plusp '> x 0) (minusp '< x 0) 2775 (rest 'cdr x) (endp 'null x) (plusp '> x 0) (minusp '< x 0)
2786 (caar car car) (cadr car cdr) (cdar cdr car) (cddr cdr cdr) 2776 (caar car car) (cadr car cdr) (cdar cdr car) (cddr cdr cdr)
2787 (caaar car caar) (caadr car cadr) (cadar car cdar) 2777 (caaar car caar) (caadr car cadr) (cadar car cdar)
2788 (caddr car cddr) (cdaar cdr caar) (cdadr cdr cadr) 2778 (caddr car cddr) (cdaar cdr caar) (cdadr cdr cadr)
2789 (cddar cdr cdar) (cdddr cdr cddr) (caaaar car caaar) 2779 (cddar cdr cdar) (cdddr cdr cddr) (caaaar car caaar)
2790 (caaadr car caadr) (caadar car cadar) (caaddr car caddr) 2780 (caaadr car caadr) (caadar car cadar) (caaddr car caddr)
2791 (cadaar car cdaar) (cadadr car cdadr) (caddar car cddar) 2781 (cadaar car cdaar) (cadadr car cdadr) (caddar car cddar)
2792 (cadddr car cdddr) (cdaaar cdr caaar) (cdaadr cdr caadr) 2782 (cadddr car cdddr) (cdaaar cdr caaar) (cdaadr cdr caadr)
2793 (cdadar cdr cadar) (cdaddr cdr caddr) (cddaar cdr cdaar) 2783 (cdadar cdr cadar) (cdaddr cdr caddr) (cddaar cdr cdaar)
2794 (cddadr cdr cdadr) (cdddar cdr cddar) (cddddr cdr cdddr) )) 2784 (cddadr cdr cdadr) (cdddar cdr cddar) (cddddr cdr cdddr)))
2795 2785
2796 ;;; Things that are inline. 2786 ;;; Things that are inline.
2797 (proclaim '(inline floatp-safe acons map concatenate notany notevery 2787 (proclaim '(inline floatp-safe acons map concatenate notany notevery
2798 ;; XEmacs change 2788 ;; XEmacs change
2799 cl-set-elt revappend nreconc)) 2789 cl-set-elt revappend nreconc
2800 2790 plusp minusp oddp evenp
2801 ;;; Things that are side-effect-free. 2791 ))
2802 (mapcar (function (lambda (x) (put x 'side-effect-free t))) 2792
2803 '(oddp evenp abs expt signum last butlast ldiff pairlis gcd lcm 2793 ;;; Things that are side-effect-free. Moved to byte-optimize.el
2804 isqrt floor* ceiling* truncate* round* mod* rem* subseq 2794 ;(dolist (fun '(oddp evenp plusp minusp
2805 list-length get* getf gethash hash-table-count)) 2795 ; abs expt signum last butlast ldiff
2806 2796 ; pairlis gcd lcm
2807 ;;; Things that are side-effect-and-error-free. 2797 ; isqrt floor* ceiling* truncate* round* mod* rem* subseq
2808 (mapcar (function (lambda (x) (put x 'side-effect-free 'error-free))) 2798 ; list-length get* getf))
2809 '(eql floatp-safe list* subst acons equalp random-state-p 2799 ; (put fun 'side-effect-free t))
2810 copy-tree sublis hash-table-p)) 2800
2801 ;;; Things that are side-effect-and-error-free. Moved to byte-optimize.el
2802 ;(dolist (fun '(eql floatp-safe list* subst acons equalp random-state-p
2803 ; copy-tree sublis))
2804 ; (put fun 'side-effect-free 'error-free))
2811 2805
2812 2806
2813 (run-hooks 'cl-macs-load-hook) 2807 (run-hooks 'cl-macs-load-hook)
2814 2808
2815 ;;; cl-macs.el ends here 2809 ;;; cl-macs.el ends here