unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* general lazy list facility for Emacs Lisp?
@ 2011-03-23 15:07 Ted Zlatanov
  2011-03-23 16:45 ` Tassilo Horn
  0 siblings, 1 reply; 23+ messages in thread
From: Ted Zlatanov @ 2011-03-23 15:07 UTC (permalink / raw)
  To: emacs-devel

Is there a package for general lazy list management in Emacs Lisp?  I
couldn't find one.

Thanks
Ted




^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 15:07 general lazy list facility for Emacs Lisp? Ted Zlatanov
@ 2011-03-23 16:45 ` Tassilo Horn
  2011-03-23 17:12   ` Ted Zlatanov
  2011-03-23 17:13   ` Drew Adams
  0 siblings, 2 replies; 23+ messages in thread
From: Tassilo Horn @ 2011-03-23 16:45 UTC (permalink / raw)
  To: Ted Zlatanov; +Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

> Is there a package for general lazy list management in Emacs Lisp?

What's a lazy list?  Something like a LazySeq in Clojure, that is, a
possibly infinite sequence of things that are only calculated when
actually consumed ("realized")?

If that's what you mean, I think the answer is no.

Bye,
Tassilo



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 16:45 ` Tassilo Horn
@ 2011-03-23 17:12   ` Ted Zlatanov
  2011-03-23 17:46     ` Thierry Volpiatto
  2011-03-23 19:03     ` Tassilo Horn
  2011-03-23 17:13   ` Drew Adams
  1 sibling, 2 replies; 23+ messages in thread
From: Ted Zlatanov @ 2011-03-23 17:12 UTC (permalink / raw)
  To: emacs-devel

On Wed, 23 Mar 2011 17:45:35 +0100 Tassilo Horn <tassilo@member.fsf.org> wrote: 

TH> Ted Zlatanov <tzz@lifelogs.com> writes:
>> Is there a package for general lazy list management in Emacs Lisp?

TH> What's a lazy list?  Something like a LazySeq in Clojure, that is, a
TH> possibly infinite sequence of things that are only calculated when
TH> actually consumed ("realized")?

TH> If that's what you mean, I think the answer is no.

Yes, that's what I mean.  In Haskell such lists are simply part of the
core language; Perl 5 can hack them together with list accessors; Perl 6
has them in the core too...  I think "lazy list" is a popular term for
the general facility?  I'm surprised no one has needed them, whatever
the name :)

Slightly related: is there a general memoization package or standard
approach to memoizing functions?

Ted




^ permalink raw reply	[flat|nested] 23+ messages in thread

* RE: general lazy list facility for Emacs Lisp?
  2011-03-23 16:45 ` Tassilo Horn
  2011-03-23 17:12   ` Ted Zlatanov
@ 2011-03-23 17:13   ` Drew Adams
  1 sibling, 0 replies; 23+ messages in thread
From: Drew Adams @ 2011-03-23 17:13 UTC (permalink / raw)
  To: 'Tassilo Horn', 'Ted Zlatanov'; +Cc: emacs-devel

> > Is there a package for general lazy list management in Emacs Lisp?
> 
> What's a lazy list?  Something like a LazySeq in Clojure, that is, a
> possibly infinite sequence of things that are only calculated when
> actually consumed ("realized")?
> 
> If that's what you mean, I think the answer is no.

My guess is yes, that's what he meant.

Lazy lists in Lisp date from this paper, at least:
"Daniel P. Friedman and David S. Wise. "Cons should not evaluate its arguments,"
in S. Michaelson and R. Milner (eds.) Automata, Languages and Programming,
Edinburgh University Press (Edinburgh, 1976), 257--284."

This is probably pretty much the same paper:
"Friedman, Daniel P. (1976). Cons should not evaluate its arguments. ICALP."





^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 17:12   ` Ted Zlatanov
@ 2011-03-23 17:46     ` Thierry Volpiatto
  2011-03-23 18:09       ` Ted Zlatanov
  2011-03-23 19:03     ` Tassilo Horn
  1 sibling, 1 reply; 23+ messages in thread
From: Thierry Volpiatto @ 2011-03-23 17:46 UTC (permalink / raw)
  To: emacs-devel

Hi Ted,

Ted Zlatanov <tzz@lifelogs.com> writes:

> On Wed, 23 Mar 2011 17:45:35 +0100 Tassilo Horn <tassilo@member.fsf.org> wrote: 
>
> TH> Ted Zlatanov <tzz@lifelogs.com> writes:
>>> Is there a package for general lazy list management in Emacs Lisp?
>
> TH> What's a lazy list?  Something like a LazySeq in Clojure, that is, a
> TH> possibly infinite sequence of things that are only calculated when
> TH> actually consumed ("realized")?
>
> TH> If that's what you mean, I think the answer is no.
>
> Yes, that's what I mean.  In Haskell such lists are simply part of the
> core language; Perl 5 can hack them together with list accessors; Perl 6
> has them in the core too...  I think "lazy list" is a popular term for
> the general facility?  I'm surprised no one has needed them, whatever
> the name :)
Not sure to understand what you want, but maybe have a look at some
ioccur.el functions:

--8<---------------cut here---------------start------------->8---
ELISP> (setq A '(a b c d))
(a b c d)

ELISP> (setq it (ioccur-iter-circular A))

[...]

ELISP> (ioccur-iter-next it)
a
ELISP> (ioccur-iter-next it)
b
ELISP> (ioccur-iter-next it)
c
ELISP> (ioccur-iter-next it)
d
ELISP> (ioccur-iter-next it)
a
ELISP> (ioccur-iter-next it)
b
ELISP> (ioccur-iter-next it)
c
ELISP> (ioccur-iter-next it)
d
ELISP> (ioccur-iter-next it)
a
--8<---------------cut here---------------end--------------->8---
etc...etc...


> Slightly related: is there a general memoization package or standard
> approach to memoizing functions?
>
> Ted
>
>
>

-- 
A+ Thierry
Get my Gnupg key:
gpg --keyserver pgp.mit.edu --recv-keys 59F29997 




^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 17:46     ` Thierry Volpiatto
@ 2011-03-23 18:09       ` Ted Zlatanov
  2011-03-23 18:27         ` Thierry Volpiatto
  0 siblings, 1 reply; 23+ messages in thread
From: Ted Zlatanov @ 2011-03-23 18:09 UTC (permalink / raw)
  To: emacs-devel

On Wed, 23 Mar 2011 18:46:16 +0100 Thierry Volpiatto <thierry.volpiatto@gmail.com> wrote: 

TV> Not sure to understand what you want, but maybe have a look at some
TV> ioccur.el functions:
ELISP> (setq A '(a b c d))
TV> (a b c d)

ELISP> (setq it (ioccur-iter-circular A))

That's useful but I was thinking more of infinite lists,
e.g. http://landoflisp.com/lazy.lisp (that's a CL implementation but the
ELisp equivalent shouldn't be too bad).

Ted




^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 18:09       ` Ted Zlatanov
@ 2011-03-23 18:27         ` Thierry Volpiatto
  2011-03-23 20:33           ` Ted Zlatanov
  0 siblings, 1 reply; 23+ messages in thread
From: Thierry Volpiatto @ 2011-03-23 18:27 UTC (permalink / raw)
  To: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

> On Wed, 23 Mar 2011 18:46:16 +0100 Thierry Volpiatto <thierry.volpiatto@gmail.com> wrote: 
>
> TV> Not sure to understand what you want, but maybe have a look at some
> TV> ioccur.el functions:
> ELISP> (setq A '(a b c d))
> TV> (a b c d)
>
> ELISP> (setq it (ioccur-iter-circular A))
>
> That's useful but I was thinking more of infinite lists,
In this case ioccur-iter-circular produce infinite list.

> e.g. http://landoflisp.com/lazy.lisp (that's a CL implementation but the
> ELisp equivalent shouldn't be too bad).
Didn't look carefuly, but it seem to be the same mechanism, with
closures.

-- 
A+ Thierry
Get my Gnupg key:
gpg --keyserver pgp.mit.edu --recv-keys 59F29997 




^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 17:12   ` Ted Zlatanov
  2011-03-23 17:46     ` Thierry Volpiatto
@ 2011-03-23 19:03     ` Tassilo Horn
  2011-03-23 19:10       ` Tassilo Horn
  2011-03-23 20:26       ` Ted Zlatanov
  1 sibling, 2 replies; 23+ messages in thread
From: Tassilo Horn @ 2011-03-23 19:03 UTC (permalink / raw)
  To: Ted Zlatanov; +Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

Hi Ted,

> Yes, that's what I mean.  In Haskell such lists are simply part of the
> core language; Perl 5 can hack them together with list accessors; Perl
> 6 has them in the core too...  I think "lazy list" is a popular term
> for the general facility?  I'm surprised no one has needed them,
> whatever the name :)

Lately, I do some Clojure coding for fun, and I really enjoy lazy seqs
there.  However, I don't see a real use case in emacs.  So, pants off,
what are you planning to do?

> Slightly related: is there a general memoization package or standard
> approach to memoizing functions?

I think for "real" memoization, you need clojures.  However, I think you
can simulate memoization with a macro like that (tested only very
briefly).

--8<---------------cut here---------------start------------->8---
(defmacro memoize (name fun)
  (let ((map-name (gensym "memo-map"))
	(args-name (gensym))
	(val-name (gensym)))
    `(progn
       (defvar ,map-name (make-hash-table :test 'equal))
       (defun ,name (&rest ,args-name)
	 (let ((,val-name (gethash ,args-name ,map-name)))
	   (if ,val-name
	       ,val-name
	     (puthash ,args-name (apply (quote ,fun) ,args-name)
		      ,map-name)))))))

;; Create a memoized version of +
(memoize memo-+ +)
;; Call it
(memo-+ 1 1)
;; ==> 2
(memo-+)
;; ==> 2, not computed by looked up in the hash table
--8<---------------cut here---------------end--------------->8---

Bye,
Tassilo



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 19:03     ` Tassilo Horn
@ 2011-03-23 19:10       ` Tassilo Horn
  2011-03-23 19:42         ` Ted Zlatanov
  2011-03-23 20:03         ` Stefan Monnier
  2011-03-23 20:26       ` Ted Zlatanov
  1 sibling, 2 replies; 23+ messages in thread
From: Tassilo Horn @ 2011-03-23 19:10 UTC (permalink / raw)
  To: Ted Zlatanov; +Cc: emacs-devel

Tassilo Horn <tassilo@member.fsf.org> writes:

> I think for "real" memoization, you need clojures.  However, I think
> you can simulate memoization with a macro like that (tested only very
> briefly).
>
> (defmacro memoize (name fun)
>   (let ((map-name (gensym "memo-map"))
> 	(args-name (gensym))
> 	(val-name (gensym)))
>     `(progn
>        (defvar ,map-name (make-hash-table :test 'equal))
>        (defun ,name (&rest ,args-name)
> 	 (let ((,val-name (gethash ,args-name ,map-name)))
> 	   (if ,val-name
> 	       ,val-name
> 	     (puthash ,args-name (apply (quote ,fun) ,args-name)
> 		      ,map-name)))))))

Just a short remark on what I've had in mind with "real" memoization: If
elisp had closures (not clojures ;-)), then one could write memoize as
function, just like the variant in the clojure source code below:

--8<---------------cut here---------------start------------->8---
(defn memoize
  [f]
  (let [mem (atom {})]
    (fn [& args]
      (if-let [e (find @mem args)]
        (val e)
        (let [ret (apply f args)]
          (swap! mem assoc args ret)
          ret)))))
--8<---------------cut here---------------end--------------->8---

Bye,
Tassilo



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 19:10       ` Tassilo Horn
@ 2011-03-23 19:42         ` Ted Zlatanov
  2011-03-24  5:27           ` Eric Schulte
  2011-03-23 20:03         ` Stefan Monnier
  1 sibling, 1 reply; 23+ messages in thread
From: Ted Zlatanov @ 2011-03-23 19:42 UTC (permalink / raw)
  To: emacs-devel

On Wed, 23 Mar 2011 20:10:27 +0100 Tassilo Horn <tassilo@member.fsf.org> wrote: 

TH> Just a short remark on what I've had in mind with "real" memoization: If
TH> elisp had closures (not clojures ;-)), then one could write memoize as
TH> function

I think `lexical-let' (according to the docstring at least) creates true
CL-style closures in ELisp.

Ted




^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 19:10       ` Tassilo Horn
  2011-03-23 19:42         ` Ted Zlatanov
@ 2011-03-23 20:03         ` Stefan Monnier
  2011-03-23 20:14           ` Jason Earl
  2011-03-23 20:18           ` Tassilo Horn
  1 sibling, 2 replies; 23+ messages in thread
From: Stefan Monnier @ 2011-03-23 20:03 UTC (permalink / raw)
  To: Tassilo Horn; +Cc: Ted Zlatanov, emacs-devel

> Just a short remark on what I've had in mind with "real" memoization: If
> elisp had closures (not clojures ;-)), then one could write memoize as
> function, just like the variant in the clojure source code below:

On a related note:
Emacs has had closures for "ever", tho it only closes over variables
that are bound by `lexical-let' (provided by CL).  Emacs-24 will have
a more integrated and efficient support for closures, by setting the
`lexical-binding' variable which makes `let' bind lexically in the same
way as in Common-Lisp.  You can try it out right now in the
`lexbind-new' branch which is pretty much ready for inclusion (mostly
lacks testing, and has currently 1 open bug apparently around eieio;
additional testers are welcome).


        Stefan



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 20:03         ` Stefan Monnier
@ 2011-03-23 20:14           ` Jason Earl
  2011-03-23 20:19             ` Tassilo Horn
  2011-03-23 20:18           ` Tassilo Horn
  1 sibling, 1 reply; 23+ messages in thread
From: Jason Earl @ 2011-03-23 20:14 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Tassilo Horn, Ted Zlatanov, emacs-devel

On Wed, Mar 23 2011, Stefan Monnier wrote:

>> Just a short remark on what I've had in mind with "real" memoization: If
>> elisp had closures (not clojures ;-)), then one could write memoize as
>> function, just like the variant in the clojure source code below:
>
> On a related note:
> Emacs has had closures for "ever", tho it only closes over variables
> that are bound by `lexical-let' (provided by CL).  Emacs-24 will have
> a more integrated and efficient support for closures, by setting the
> `lexical-binding' variable which makes `let' bind lexically in the same
> way as in Common-Lisp.  You can try it out right now in the
> `lexbind-new' branch which is pretty much ready for inclusion (mostly
> lacks testing, and has currently 1 open bug apparently around eieio;
> additional testers are welcome).
>
>
>         Stefan

Do you have a url for the branch?

Jason



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 20:03         ` Stefan Monnier
  2011-03-23 20:14           ` Jason Earl
@ 2011-03-23 20:18           ` Tassilo Horn
  2011-03-23 20:41             ` Tassilo Horn
  1 sibling, 1 reply; 23+ messages in thread
From: Tassilo Horn @ 2011-03-23 20:18 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Ted Zlatanov, emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

Hi Stefan,

> Emacs has had closures for "ever", tho it only closes over variables
> that are bound by `lexical-let' (provided by CL).  Emacs-24 will have
> a more integrated and efficient support for closures, by setting the
> `lexical-binding' variable which makes `let' bind lexically in the
> same way as in Common-Lisp.  You can try it out right now in the
> `lexbind-new' branch which is pretty much ready for inclusion (mostly
> lacks testing, and has currently 1 open bug apparently around eieio;
> additional testers are welcome).

I've started compiling and will report issues if I find one in my daily
use.  I guess, that there are many packages that won't work with
lexical-binding set to t, right?

I mean, at least I've seen code that uses let in order to save some
parameters, like

  (let ((foo "bar"))
    (function-that-does-something-with-foo))

without defvar-ing foo.  I might be wrong, but I think I remember
org-mode did so in some places...

Bye,
Tassilo



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 20:14           ` Jason Earl
@ 2011-03-23 20:19             ` Tassilo Horn
  0 siblings, 0 replies; 23+ messages in thread
From: Tassilo Horn @ 2011-03-23 20:19 UTC (permalink / raw)
  To: Jason Earl; +Cc: Ted Zlatanov, Stefan Monnier, emacs-devel

Jason Earl <jearl@notengoamigos.org> writes:

> Do you have a url for the branch?

bzr://bzr.savannah.gnu.org/emacs/lexbind-new/

Bye,
Tassilo



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 19:03     ` Tassilo Horn
  2011-03-23 19:10       ` Tassilo Horn
@ 2011-03-23 20:26       ` Ted Zlatanov
  1 sibling, 0 replies; 23+ messages in thread
From: Ted Zlatanov @ 2011-03-23 20:26 UTC (permalink / raw)
  To: emacs-devel

On Wed, 23 Mar 2011 20:03:06 +0100 Tassilo Horn <tassilo@member.fsf.org> wrote: 

TH> Lately, I do some Clojure coding for fun, and I really enjoy lazy seqs
TH> there.  However, I don't see a real use case in emacs.  So, pants off,
TH> what are you planning to do?

If I mention Haskell and Perl 6 in a sentence you can assume it's mostly
theoretical utility ;)

Seriously though, I want to use them for some private ELisp work looking
at large data sets.  They fit the data model well.

Ted




^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 18:27         ` Thierry Volpiatto
@ 2011-03-23 20:33           ` Ted Zlatanov
  2011-03-23 20:43             ` Ted Zlatanov
  0 siblings, 1 reply; 23+ messages in thread
From: Ted Zlatanov @ 2011-03-23 20:33 UTC (permalink / raw)
  To: emacs-devel

On Wed, 23 Mar 2011 19:27:54 +0100 Thierry Volpiatto <thierry.volpiatto@gmail.com> wrote: 

TV> Ted Zlatanov <tzz@lifelogs.com> writes:
>> On Wed, 23 Mar 2011 18:46:16 +0100 Thierry Volpiatto <thierry.volpiatto@gmail.com> wrote: 
>> 
TV> Not sure to understand what you want, but maybe have a look at some
TV> ioccur.el functions:
ELISP> (setq A '(a b c d))
TV> (a b c d)
>> 
ELISP> (setq it (ioccur-iter-circular A))
>> 
>> That's useful but I was thinking more of infinite lists,
TV> In this case ioccur-iter-circular produce infinite list.

Hmm, it's not really what I had in mind, although it's certainly
useful...  The ioccur.el code returns an iterator across an existing
collection.  I need the next element dynamically generated, not
retrieved from a pre-existing collection.  The idea is to avoid the
memory and CPU usage until you know you need the data.  

I think Tassilo's macro or something similar with closures is closer to
my need and the general meaning of "lazy lists."

Ted





^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 20:18           ` Tassilo Horn
@ 2011-03-23 20:41             ` Tassilo Horn
  2011-03-23 21:51               ` Stefan Monnier
  0 siblings, 1 reply; 23+ messages in thread
From: Tassilo Horn @ 2011-03-23 20:41 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Ted Zlatanov, emacs-devel

Tassilo Horn <tassilo@member.fsf.org> writes:

>> You can try it out right now in the `lexbind-new' branch which is
>> pretty much ready for inclusion (mostly lacks testing, and has
>> currently 1 open bug apparently around eieio; additional testers are
>> welcome).
>
> I've started compiling

Compiled it.

--8<---------------cut here---------------start------------->8---
(setq lexical-binding t)

(let ((x 1))
  (defun lex-test (y)
    (+ x y)))

(lex-test 1)
;; ==> 2
--8<---------------cut here---------------end--------------->8---

Wow! :-)

> and will report issues if I find one in my daily use.

Found one!  C-h k lexical-binding RET errors.  I've reported it, but the
confirmation mail has not yet arrived.

> I guess, that there are many packages that won't work with
> lexical-binding set to t, right?

Seems to be a false assumption.  At least org and Gnus are running fine.

Bye,
Tassilo



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 20:33           ` Ted Zlatanov
@ 2011-03-23 20:43             ` Ted Zlatanov
  0 siblings, 0 replies; 23+ messages in thread
From: Ted Zlatanov @ 2011-03-23 20:43 UTC (permalink / raw)
  To: emacs-devel

On Wed, 23 Mar 2011 15:33:44 -0500 Ted Zlatanov <tzz@lifelogs.com> wrote: 

TZ> I think Tassilo's macro or something similar with closures is closer to
TZ> my need and the general meaning of "lazy lists."

s/Tassilo's macro/the landoflisp.com implementation/

Sorry for the confusion.

Ted




^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 20:41             ` Tassilo Horn
@ 2011-03-23 21:51               ` Stefan Monnier
  2011-03-24  7:26                 ` Tassilo Horn
  0 siblings, 1 reply; 23+ messages in thread
From: Stefan Monnier @ 2011-03-23 21:51 UTC (permalink / raw)
  To: Tassilo Horn; +Cc: Ted Zlatanov, emacs-devel

> (let ((x 1))
>   (defun lex-test (y)
>     (+ x y)))

Note that the byte-compiler won't like the above.  You'll want either

  (let ((x 1))
    (defalias 'lex-test (lambda (y) (+ x y))))

or

  (defalias 'lex-test (let ((x 1)) (lambda (y) (+ x y))))

or something like that.
  
>> and will report issues if I find one in my daily use.
> Found one!  C-h k lexical-binding RET errors.

Hmm... works here.

> I've reported it, but the confirmation mail has not yet arrived.

I'll wait for the precise report, then.

>> I guess, that there are many packages that won't work with
>> lexical-binding set to t, right?

Indeed.  Tho check the Elisp manual for hints about how to convert
(it's usually pretty easy).

> Seems to be a false assumption.  At least org and Gnus are running fine.

I think you're misunderstanding your test, because I doubt either of
Gnus or Org would work with lexical-binding without any
additional modification.
lexical-binding is a variable that applies to a file/buffer.  E.g. it
affects the compiler but not the compiled code.


        Stefan



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 19:42         ` Ted Zlatanov
@ 2011-03-24  5:27           ` Eric Schulte
  2011-03-24 15:43             ` Ted Zlatanov
  0 siblings, 1 reply; 23+ messages in thread
From: Eric Schulte @ 2011-03-24  5:27 UTC (permalink / raw)
  To: Ted Zlatanov; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 612 bytes --]

Ted Zlatanov <tzz@lifelogs.com> writes:

> On Wed, 23 Mar 2011 20:10:27 +0100 Tassilo Horn <tassilo@member.fsf.org> wrote: 
>
> TH> Just a short remark on what I've had in mind with "real" memoization: If
> TH> elisp had closures (not clojures ;-)), then one could write memoize as
> TH> function
>
> I think `lexical-let' (according to the docstring at least) creates true
> CL-style closures in ELisp.
>

Just for completeness, a lazy.el file is attached implementing lazy
sequences in Emacs Lisp.  This is basically an exact copy of lazy.lisp
with `lexical-let' used where closures are needed.

Best -- Eric


[-- Attachment #2: lazy.el --]
[-- Type: application/emacs-lisp, Size: 1974 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-23 21:51               ` Stefan Monnier
@ 2011-03-24  7:26                 ` Tassilo Horn
  0 siblings, 0 replies; 23+ messages in thread
From: Tassilo Horn @ 2011-03-24  7:26 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Ted Zlatanov, emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

Hi Stefan,

> Note that the byte-compiler won't like the above.  You'll want either
>
>   (let ((x 1))
>     (defalias 'lex-test (lambda (y) (+ x y))))
>
> or
>
>   (defalias 'lex-test (let ((x 1)) (lambda (y) (+ x y))))
>
> or something like that.

Yes, I know, just wanted to check if it works at all.

>>> and will report issues if I find one in my daily use.
>> Found one!  C-h k lexical-binding RET errors.
>
> Hmm... works here.

Strange.

>> I've reported it, but the confirmation mail has not yet arrived.
>
> I'll wait for the precise report, then.

Oh, I'll have to add that this happens for any describe command, no
matter what I describe.  First I get that error, but after quitting the
debugger, I get the *Help* buffer anyway...

>>> I guess, that there are many packages that won't work with
>>> lexical-binding set to t, right?
>
> Indeed.  Tho check the Elisp manual for hints about how to convert
> (it's usually pretty easy).

Great, I'll see if I can help with some patches for transitioning the
packages I'm using most.

>> Seems to be a false assumption.  At least org and Gnus are running
>> fine.
>
> I think you're misunderstanding your test, because I doubt either of
> Gnus or Org would work with lexical-binding without any additional
> modification.  lexical-binding is a variable that applies to a
> file/buffer.  E.g. it affects the compiler but not the compiled code.

Ah, ok.  In the mean time, I've found out that Gnus does not build
(byte-compile) at all with a lexical-binding set to t.

Bye,
Tassilo



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-24  5:27           ` Eric Schulte
@ 2011-03-24 15:43             ` Ted Zlatanov
  2011-03-25 12:30               ` Eric Schulte
  0 siblings, 1 reply; 23+ messages in thread
From: Ted Zlatanov @ 2011-03-24 15:43 UTC (permalink / raw)
  To: emacs-devel

On Wed, 23 Mar 2011 23:27:48 -0600 "Eric Schulte" <schulte.eric@gmail.com> wrote: 

ES> Just for completeness, a lazy.el file is attached implementing lazy
ES> sequences in Emacs Lisp.  This is basically an exact copy of lazy.lisp
ES> with `lexical-let' used where closures are needed.

Thanks, Eric.  I'm not sure of the http://landoflisp.com/lazy.lisp
license.  There's also http://www.common-lisp.org/project/clazy (very
similar to lazy.lisp), http://cl-heresy.sourceforge.net/Heresy.htm,
http://common-lisp.net/project/funds, and
http://www.common-lisp.org/project/fset all of which have different and
viable implementations (the common name seems to be "purely functional
data structures").  They all refer to SICP as a reference since it has a
similar implementation of the basic idea.  Of all of them, lazy.lisp
seems most basic; funds and fset seem very data-oriented.

Heresy seems like the most comprehensive and powerful package (see
http://cl-heresy.sourceforge.net/Heresy.htm for examples, details, and
functions provided).  I'd love to use it but I don't know CL well so it
will take me some time to port it.  Still, it has a BSD license and
should be OK as an ELPA package.  Does that sound reasonable?  Eric, are
you interested in helping me port it?

Thanks
Ted




^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: general lazy list facility for Emacs Lisp?
  2011-03-24 15:43             ` Ted Zlatanov
@ 2011-03-25 12:30               ` Eric Schulte
  0 siblings, 0 replies; 23+ messages in thread
From: Eric Schulte @ 2011-03-25 12:30 UTC (permalink / raw)
  To: Ted Zlatanov; +Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

> On Wed, 23 Mar 2011 23:27:48 -0600 "Eric Schulte" <schulte.eric@gmail.com> wrote: 
>
> ES> Just for completeness, a lazy.el file is attached implementing lazy
> ES> sequences in Emacs Lisp.  This is basically an exact copy of lazy.lisp
> ES> with `lexical-let' used where closures are needed.
>
> Thanks, Eric.  I'm not sure of the http://landoflisp.com/lazy.lisp
> license.  There's also http://www.common-lisp.org/project/clazy (very
> similar to lazy.lisp), http://cl-heresy.sourceforge.net/Heresy.htm,
> http://common-lisp.net/project/funds, and
> http://www.common-lisp.org/project/fset all of which have different and
> viable implementations (the common name seems to be "purely functional
> data structures").  They all refer to SICP as a reference since it has a
> similar implementation of the basic idea.  Of all of them, lazy.lisp
> seems most basic; funds and fset seem very data-oriented.
>
> Heresy seems like the most comprehensive and powerful package (see
> http://cl-heresy.sourceforge.net/Heresy.htm for examples, details, and
> functions provided).  I'd love to use it but I don't know CL well so it
> will take me some time to port it.  Still, it has a BSD license and
> should be OK as an ELPA package.  Does that sound reasonable?  Eric, are
> you interested in helping me port it?
>

Sure, I can't guarantee any significant time commitment, but this would
serve as a good CL learning experience for me, so count me as /on board/
to help to port cl-heresy to elisp.

As a first step, I've copied the latest release of cl-heresy into a git
repository on repo.or.cz [1].  Anyone can anonymously push to the mob
branch of this repo (see [2]), and anyone who's interested in helping
can send me their repo.or.cz username and I'll grant push permission for
the master branch.

Best -- Eric

Footnotes: 
[1]  http://repo.or.cz/w/el-heresy.git

[2]  http://repo.or.cz/h/mob.html




^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2011-03-25 12:30 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-23 15:07 general lazy list facility for Emacs Lisp? Ted Zlatanov
2011-03-23 16:45 ` Tassilo Horn
2011-03-23 17:12   ` Ted Zlatanov
2011-03-23 17:46     ` Thierry Volpiatto
2011-03-23 18:09       ` Ted Zlatanov
2011-03-23 18:27         ` Thierry Volpiatto
2011-03-23 20:33           ` Ted Zlatanov
2011-03-23 20:43             ` Ted Zlatanov
2011-03-23 19:03     ` Tassilo Horn
2011-03-23 19:10       ` Tassilo Horn
2011-03-23 19:42         ` Ted Zlatanov
2011-03-24  5:27           ` Eric Schulte
2011-03-24 15:43             ` Ted Zlatanov
2011-03-25 12:30               ` Eric Schulte
2011-03-23 20:03         ` Stefan Monnier
2011-03-23 20:14           ` Jason Earl
2011-03-23 20:19             ` Tassilo Horn
2011-03-23 20:18           ` Tassilo Horn
2011-03-23 20:41             ` Tassilo Horn
2011-03-23 21:51               ` Stefan Monnier
2011-03-24  7:26                 ` Tassilo Horn
2011-03-23 20:26       ` Ted Zlatanov
2011-03-23 17:13   ` Drew Adams

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).