branch: externals/eev commit 666476975ed6db1a7341995f1f57087af3c9f634 Author: Eduardo Ochs <eduardoo...@gmail.com> Commit: Eduardo Ochs <eduardoo...@gmail.com>
Added the sections 1, 2, and 3 to `(find-lexical-intro)'. --- VERSION | 4 +- eev-intro.el | 129 +++++++++++++++++++++++++++++++++++++++------------------- eev-tlinks.el | 8 ++-- 3 files changed, 93 insertions(+), 48 deletions(-) diff --git a/VERSION b/VERSION index 37b6ff7..ef91aca 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Sat Aug 14 00:16:32 GMT 2021 -Fri Aug 13 21:16:32 -03 2021 +Sat Aug 14 02:49:07 GMT 2021 +Fri Aug 13 23:49:07 -03 2021 diff --git a/eev-intro.el b/eev-intro.el index 74e2e54..43a2c5b 100644 --- a/eev-intro.el +++ b/eev-intro.el @@ -13607,67 +13607,114 @@ modes to compare the results. +(The rest of this tutorial is just a first draft) -(The rest of this tutorial will be rewritten) - -0. `ee-eval-lexical' -==================== - - -See: (find-eev \"eev-eval.el\" \"ee-eval-last-sexp\") - (find-eev \"eev-eval.el\" \"ee-eval-last-sexp\" \"11:\") - (find-eev \"eev-eval.el\" \"tools\") - (find-eev \"eev-eval.el\" \"tools\" \"ee-eval-lexical\") - (find-efunctiondescr 'eval) - -Try to evaluate this sexp with `M-e' and with `M-1 M-1 M-e': +1. `lambda' and `function' +========================== +See: (find-elnode \"Anonymous Functions\" \"Macro: lambda\") + (find-elnode \"Anonymous Functions\" \"Special Form: function\") + (find-elnode \"Anonymous Functions\" \"Special Form: function\" \"converted\") (let ((x 42)) - (defun foo () (* x x)) - (symbol-function 'foo)) + (lambda () x) + ) + (let ((x 42)) + (function + (lambda () x) + ) + ) -1. Creating closures +2. How closures work ==================== -Long form: - - (eval '(let ((x 42)) (defun foo () (* x x))) 'lexical) - (eval '(let ((x 42)) (defun foo () (* x x))) nil) - (symbol-function 'foo) +See: (find-elnode \"Dynamic Binding\" \"defun getx\") + (find-elnode \"Lexical Binding\" \"defun getx\") + (find-elnode \"Void Variables\") -Short form: + (let ((x 20)) + (defun getx () x) + ) - (let ((x 42)) - (defun foo () (* x x)) - (symbol-function 'foo)) + (makunbound 'x) + (setq x 99) + (getx) + (let ((x 42)) (getx)) + -Even shorter: - (let ((x 42)) - (function (lambda foo () (* x x)))) +3. `get/set' +============ +;; These fsets work as defuns. +;; See: (find-elnode \"Function Cells\") +(fset 'foo (lambda () 20)) +(fset 'foo (lambda () 42)) +(foo) +;; This is the only sexp in this block that needs +;; to be run in lexical binding mode. +;; +(defun get/set0 () + \"Return a list with a `getter' closure and a `setter' closure. +The getter and the setter share the same lexical environment - +which means that they operate on the same `x'. +Different calls to this function generate getters and setters +with independent lexical environments - which means that they +operate on independent `x's. +This defun need to be executed in lexical binding mode.\" + (let* ((x nil)) + (list (lambda () x) + (lambda (newvalue) (setq x newvalue))))) + +(defun get/set (getter setter) + \"Define a SETTER and a GETTER that operate on the same variable. +SETTER and GETTER are symbols: names of functions. The variable +lives in a lexical environment that is shared by both the GETTER +and the SETTER. Each call to this function generates a different +lexical environment.\" + (let ((gs (get/set0))) + (fset getter (nth 0 gs)) + (fset setter (nth 1 gs)))) + +;; Check that geta/seta and getb/setb operate on different +;; variables: +;; +(get/set 'geta 'seta) +(get/set 'getb 'setb) +(symbol-function 'geta) +(symbol-function 'getb) +(symbol-function 'seta) +(symbol-function 'setb) +(seta 20) +(setb 42) +(geta) +(getb) + + +;; Check that geta/seta use the same lexical environment +;; and that getb/setb use a second lexical environment. +;; See: (find-elnode \"Closures\") + + (symbol-function 'seta) + (cdr (symbol-function 'seta)) +(car (cdr (symbol-function 'seta))) + +(eq + (cadr (symbol-function 'geta)) + (cadr (symbol-function 'seta)) + ) -2. `letxgetx' -============= -See: (find-elnode \"Dynamic Binding\" \"defun getx\") - (find-elnode \"Lexical Binding\" \"defun getx\") - (find-elnode \"Void Variables\") +(eq + (cadr (symbol-function 'getb)) + (cadr (symbol-function 'setb)) + ) - (makunbound 'x) - (defun getx () x) - (getx) - (let ((x 1)) (getx)) - (defun letxgetx () (let ((x 1)) (getx))) - (letxgetx) - (symbol-function 'letxgetx) - " pos-spec-list))) diff --git a/eev-tlinks.el b/eev-tlinks.el index f18c02d..5db38ee 100644 --- a/eev-tlinks.el +++ b/eev-tlinks.el @@ -19,7 +19,7 @@ ;; ;; Author: Eduardo Ochs <eduardoo...@gmail.com> ;; Maintainer: Eduardo Ochs <eduardoo...@gmail.com> -;; Version: 20210709 +;; Version: 20210813 ;; Keywords: e-scripts ;; ;; Latest version: <http://angg.twu.net/eev-current/eev-tlinks.el> @@ -47,10 +47,7 @@ ;; NOTE (written in 2019mar05): some of the functions here are very ;; old and ugly and I haven't used them in ages. They will be deleted -;; in the next few months. - -;; (find-efunctiondescr 'ee-upload-links) -;; (find-eev "eev-wrap.el" "eewrap-eewrap") +;; in the next few (or many) months. @@ -2364,6 +2361,7 @@ This function is used by `ee-0x0-upload-region'." (find-efunction 'find-0x0-links) "" ,(ee-template0 "\ +{url} (find-wget \"{url}\") (find-wget-elisp \"{url}\") ")