about summary refs log tree commit diff stats
path: root/lisp/compat.el
blob: 4bb87060bb101d0b518204488e32982b21179fa5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
;;; compat.el --- Thin backward-compatibility shim -*- lexical-binding: t; -*-

;;; Commentary:

;; I use different versionso of Emacs.  Sometimes I have to copy-paste functions
;; from newer Emacs to make my customizations work.  This is that file.

;; This is probably ill-advised.

;;; Code:

;; Load stuff in compat/ subdirectory
(dolist (file (directory-files (locate-user-emacs-file "lisp/compat") :full "\\.el\\'"))
  (load file :noerror))

;; Other stuff...

(unless (fboundp 'dlet)
  (defmacro dlet (binders &rest body)
    "Like `let' but using dynamic scoping."
    (declare (indent 1) (debug let))
    ;; (defvar FOO) only affects the current scope, but in order for
    ;; this not to affect code after the main `let' we need to create a new scope,
    ;; which is what the surrounding `let' is for.
    ;; FIXME: (let () ...) currently doesn't actually create a new scope,
    ;; which is why we use (let (_) ...).
    `(let (_)
       ,@(mapcar (lambda (binder)
                   `(defvar ,(if (consp binder) (car binder) binder)))
                 binders)
       (let ,binders ,@body))))

(provide 'compat)
;;; compat.el ends here