aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArun Isaac2020-08-02 22:21:24 +0530
committerArun Isaac2020-08-03 01:24:12 +0530
commit2ef369f0fd06b4eb48b9f539553835838daf621f (patch)
tree55657e3a7db25f58e784ef2d517525da669c8ffa
parentd88427a30a52314e7c99282bd556ac35cfed6ddb (diff)
downloadennum-2ef369f0fd06b4eb48b9f539553835838daf621f.tar.gz
ennum-2ef369f0fd06b4eb48b9f539553835838daf621f.tar.lz
ennum-2ef369f0fd06b4eb48b9f539553835838daf621f.zip
Use closures instead of ennum-exp objects.
The lexical environment of a closure can capture all inputs to an expression. Earlier we were capturing some of these inputs using the inputs slot of an ennum-exp object. Capturing dynamically scoped global variables is a different matter, and is not addressed by this commit. * ennum.el (ennum-exp): Delete type. (ennum--rewrite-inputs): Delete macro. (ennum-eval): Deal with closures not ennum-exp objects. (ennum-store-item-union, ennum-publish-post, ennum-publish-generic, ennum-publish-feed, ennum-publish-image, ennum-publish-copy): Pass inputs as lexically bound variables of a closure, rather than as ennum-exp inputs.
-rw-r--r--ennum.el161
1 files changed, 67 insertions, 94 deletions
diff --git a/ennum.el b/ennum.el
index 86295f8..bfd3bc7 100644
--- a/ennum.el
+++ b/ennum.el
@@ -64,42 +64,16 @@ respectively by - and _, and the pad character = is optional."
(t (chmod file file-mode))))
(ennum-directory-files directory t t)))
-(cl-defstruct (ennum-exp (:constructor ennum-make-exp)
- (:copier nil))
- inputs proc)
-
-(defun ennum--rewrite-inputs (exp)
- (pcase exp
- (`(ennum-input ,arg)
- (let ((input-identifier (gensym "input")))
- (vector input-identifier (list arg) (list input-identifier))))
- (`(,parent . ,childern)
- (seq-reduce (pcase-lambda (`[,result ,inputs ,input-identifiers] node)
- (pcase (ennum--rewrite-inputs node)
- (`[,modified-tree ,new-inputs ,new-input-identifiers]
- (vector (append result (list modified-tree))
- (append inputs new-inputs)
- (append input-identifiers new-input-identifiers)))))
- exp
- (vector nil nil nil)))
- (leaf (vector exp nil nil))))
-
(defmacro ennum-exp (&rest body)
- (let ((raw-expression `(progn ,@body)))
- (pcase (ennum--rewrite-inputs raw-expression)
- (`[,rewritten-body ,inputs ,input-identifiers]
- `(ennum-eval
- (ennum-make-exp
- :inputs (list ,@inputs)
- :proc (lambda ,input-identifiers ,rewritten-body)))))))
-
-(defun ennum-eval (exp)
+ `(ennum-eval (lambda () ,@body)))
+
+(defun ennum-eval (closure)
(let ((output
(expand-file-name
(with-temp-buffer
(let ((print-length nil)
(print-level nil))
- (print exp (current-buffer)))
+ (print closure (current-buffer)))
(ennum--hash))
(ennum-setting :store))))
;; Create store if it doesn't exist
@@ -110,8 +84,7 @@ respectively by - and _, and the pad character = is optional."
(message "Building %s" output)
(ennum-with-temporary-directory temporary-directory
(ennum-with-current-directory temporary-directory
- (apply (ennum-exp-proc exp)
- (ennum-exp-inputs exp)))
+ (funcall closure))
(rename-file temporary-directory output))
(ennum--set-file-modes-recursively output #o555 #o444 #o555))
output))
@@ -128,7 +101,7 @@ respectively by - and _, and the pad character = is optional."
(make-directory destination)
(copy-file source destination t)))))
(reverse (ennum-directory-files item nil t))))
- (ennum-input items))))
+ items)))
(defmacro ennum-make-functional-setter (name copier accessor)
`(defun ,name (object new-value)
@@ -333,44 +306,43 @@ result as a string."
(org-export-as 'ennum-html nil nil body-only ext-plist))))))
(defun ennum-publish-post (post)
- (append
- (list
- (ennum-exp
- (ennum-export-post post
- (ennum-input (ennum-intern (ennum-post-filename post)))
- (ennum--org-output-filename (ennum-post-filename post)))))
- (when (ennum-post-tangle post)
+ (let ((interned-org-file (ennum-intern (ennum-post-filename post))))
+ (append
(list
(ennum-exp
- ;; TODO: Handle tangle outputs that are nested
- ;; into directories, and when each tangle output
- ;; is nested into a different directory.
- (let* ((input-org-file (ennum-input (ennum-intern (ennum-post-filename post))))
- (post-file-copy
- (expand-file-name
- (file-name-nondirectory input-org-file)
- (ennum-setting :static-directory))))
- (ennum-copy input-org-file post-file-copy)
- (org-babel-tangle-file post-file-copy)
- (delete-file post-file-copy)))))
- (seq-mapcat 'ennum-publish-link (ennum-post-links post))))
+ (ennum-export-post post
+ interned-org-file
+ (ennum--org-output-filename (ennum-post-filename post)))))
+ (when (ennum-post-tangle post)
+ (list
+ (ennum-exp
+ ;; TODO: Handle tangle outputs that are nested
+ ;; into directories, and when each tangle output
+ ;; is nested into a different directory.
+ (let* ((post-file-copy
+ (expand-file-name
+ (file-name-nondirectory interned-org-file)
+ (ennum-setting :static-directory))))
+ (ennum-copy interned-org-file post-file-copy)
+ (org-babel-tangle-file post-file-copy)
+ (delete-file post-file-copy)))))
+ (seq-mapcat 'ennum-publish-link (ennum-post-links post)))))
(defun ennum-publish-generic (other-files-directory file)
- (ennum-exp
- (let ((interned-file
- (ennum-input (ennum-intern
+ (let ((interned-file (ennum-intern
(ennum--file-join other-files-directory file))))
- (output-file
- (pcase (file-name-extension file)
- ("org" (ennum--org-output-filename file))
- (_ file))))
- (pcase (file-name-extension interned-file)
- ("org"
- (when (file-name-directory output-file)
- (ennum-mkdir-p (file-name-directory output-file)))
- (ennum-with-file-contents interned-file
- (org-export-to-file 'html output-file)))
- (_ (ennum-copy interned-file output-file))))))
+ (ennum-exp
+ (let ((output-file
+ (pcase (file-name-extension file)
+ ("org" (ennum--org-output-filename file))
+ (_ file))))
+ (pcase (file-name-extension interned-file)
+ ("org"
+ (when (file-name-directory output-file)
+ (ennum-mkdir-p (file-name-directory output-file)))
+ (ennum-with-file-contents interned-file
+ (org-export-to-file 'html output-file)))
+ (_ (ennum-copy interned-file output-file)))))))
(defun ennum-video-poster (video)
(or (seq-find (lambda (file)
@@ -471,28 +443,29 @@ result as a string."
(format-time-string "%Y-%m-%dT%H:%M:%SZ" date))
(defun ennum-publish-feed (feed-file title rights posts)
- (ennum-exp
- ;; TODO: Create ennu-mkdir-p-for-file
- (when (file-name-directory feed-file)
- (ennum-mkdir-p (file-name-directory feed-file)))
- (with-temp-file feed-file
- (insert
- (xmlgen
- `(feed :xmlns "http://www.w3.org/2005/Atom"
- (id ,(ennum--absolute-uri ""))
- (title ,title)
- (updated ,(ennum--atom-date (ennum-post-date (first posts))))
- (link :rel "self" :href ,(ennum--absolute-uri feed-file))
- (generator
- ,(format "Emacs %d.%d Org-mode %s ennum %s"
- emacs-major-version emacs-minor-version (org-version) ennum-version))
- (rights ,rights)
- ,@(seq-mapn (lambda (post interned-post-file)
- (ennum--feed-entry post interned-post-file))
- posts
- (ennum-input (seq-map (lambda (post)
- (ennum-intern (ennum-post-filename post)))
- posts)))))))))
+ (let ((interned-post-files
+ (seq-map (lambda (post)
+ (ennum-intern (ennum-post-filename post)))
+ posts)))
+ (ennum-exp
+ ;; TODO: Create ennu-mkdir-p-for-file
+ (when (file-name-directory feed-file)
+ (ennum-mkdir-p (file-name-directory feed-file)))
+ (with-temp-file feed-file
+ (insert
+ (xmlgen
+ `(feed :xmlns "http://www.w3.org/2005/Atom"
+ (id ,(ennum--absolute-uri ""))
+ (title ,title)
+ (updated ,(ennum--atom-date (ennum-post-date (first posts))))
+ (link :rel "self" :href ,(ennum--absolute-uri feed-file))
+ (generator
+ ,(format "Emacs %d.%d Org-mode %s ennum %s"
+ emacs-major-version emacs-minor-version (org-version) ennum-version))
+ (rights ,rights)
+ ,@(seq-mapn (lambda (post interned-post-file)
+ (ennum--feed-entry post interned-post-file))
+ posts interned-post-files))))))))
(defun ennum--feed-entry (post interned-post-file)
(let ((link (ennum--absolute-uri (ennum--org-output-filename
@@ -551,21 +524,21 @@ result as a string."
"/"))
(defun ennum-publish-image (image width)
- (ennum-exp
- (let ((input-image (ennum-input (ennum-intern image))))
+ (let ((interned-image (ennum-intern image)))
+ (ennum-exp
(ennum-mkdir-p (ennum-setting :images-directory))
(ennum-image-optimize-image
(ennum-image-resize-image
- input-image
+ interned-image
(ennum--file-join
(ennum-setting :images-directory)
(ennum-image-output-filename
- (file-name-nondirectory input-image) width))
+ (file-name-nondirectory interned-image) width))
width)))))
(defun ennum-publish-copy (file)
- (ennum-exp
- (ennum-copy (ennum-input (ennum-intern file)) file)))
+ (let ((interned-file (ennum-intern file)))
+ (ennum-exp (ennum-copy interned-file file))))
(defun newest-file (files)
(pcase files