* Cycle Org Shift Select
@ 2020-11-06 15:23 Christopher Dimech
2020-11-09 19:12 ` Noam Postavsky
2020-11-09 20:10 ` Michael Heerdegen
0 siblings, 2 replies; 28+ messages in thread
From: Christopher Dimech @ 2020-11-06 15:23 UTC (permalink / raw)
To: Help Gnu Emacs
I have this code to cycle the Shift Select option for Org Mode.
I am a little concerned that (nconc Shftsel Shftsel) will continually
append, rather than just cycle through the list.
Looking for a better way to this job.
(defun Org-Shftsel-Cycle ()
;; Switches between options to org-support-shift-select
(interactive)
(let ((Shftsel (list nil t nil 'always)))
(nconc Shftsel Shftsel)
(setq org-support-shift-select
(cadr (member org-support-shift-select Shftsel))) ))
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-06 15:23 Cycle Org Shift Select Christopher Dimech
@ 2020-11-09 19:12 ` Noam Postavsky
2020-11-09 20:13 ` Michael Heerdegen
2020-11-10 16:37 ` Drew Adams
2020-11-09 20:10 ` Michael Heerdegen
1 sibling, 2 replies; 28+ messages in thread
From: Noam Postavsky @ 2020-11-09 19:12 UTC (permalink / raw)
To: Christopher Dimech; +Cc: Help Gnu Emacs
On Fri, 6 Nov 2020 at 10:23, Christopher Dimech <dimech@gmx.com> wrote:
> I am a little concerned that (nconc Shftsel Shftsel) will continually
> append, rather than just cycle through the list.
I don't understand what you mean by "continually append", but your
code will never reach `always' because you have `nil' again after `t'.
It should be enough to just put `nil' after `always':
(defun Org-Shftsel-Cycle ()
;; Switches between options to org-support-shift-select
(interactive)
(setq org-support-shift-select
(cadr (memq org-support-shift-select '(nil t always nil)))))
You could also use a circular list which saves a cons cell (i.e.,
point back to the first `nil', instead of having an "extra" one at the
end):
'#1=(nil t always . #1#)
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-06 15:23 Cycle Org Shift Select Christopher Dimech
2020-11-09 19:12 ` Noam Postavsky
@ 2020-11-09 20:10 ` Michael Heerdegen
2020-11-09 20:35 ` Christopher Dimech
1 sibling, 1 reply; 28+ messages in thread
From: Michael Heerdegen @ 2020-11-09 20:10 UTC (permalink / raw)
To: Christopher Dimech; +Cc: Help Gnu Emacs
Christopher Dimech <dimech@gmx.com> writes:
> I have this code to cycle the Shift Select option for Org Mode.
>
> I am a little concerned that (nconc Shftsel Shftsel) will continually
> append, rather than just cycle through the list.
>
> Looking for a better way to this job.
What behavior do you want to get? Do you want to cycling to start
always from the same point and cycle only for repeated commands
invocations?
Or do you want to have a state remembered by the command (I guess so)?
Should this then really be a global or a per-buffer or per-window state?
Regards,
Michael.
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 19:12 ` Noam Postavsky
@ 2020-11-09 20:13 ` Michael Heerdegen
2020-11-09 20:26 ` Noam Postavsky
2020-11-09 20:40 ` Christopher Dimech
2020-11-10 16:37 ` Drew Adams
1 sibling, 2 replies; 28+ messages in thread
From: Michael Heerdegen @ 2020-11-09 20:13 UTC (permalink / raw)
To: help-gnu-emacs
Noam Postavsky <npostavs@gmail.com> writes:
> '#1=(nil t always . #1#)
I once have been told that circular programs are problematic. Today I
would prefer the use of a (maybe buffer local) helper variable (or, if
it's only in my init file, simply maybe make the command a closure).
Regards,
Michael.
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 20:13 ` Michael Heerdegen
@ 2020-11-09 20:26 ` Noam Postavsky
2020-11-09 20:31 ` Michael Heerdegen
2020-11-09 20:40 ` Christopher Dimech
1 sibling, 1 reply; 28+ messages in thread
From: Noam Postavsky @ 2020-11-09 20:26 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: Help Gnu Emacs mailing list
On Mon, 9 Nov 2020 at 15:13, Michael Heerdegen <michael_heerdegen@web.de> wrote:
> > '#1=(nil t always . #1#)
>
> I once have been told that circular programs are problematic. Today I
> would prefer the use of a (maybe buffer local) helper variable
It's not a program, just a replacement for the '(nil t always nil)
literal I put in my suggestion.
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 20:26 ` Noam Postavsky
@ 2020-11-09 20:31 ` Michael Heerdegen
2020-11-09 20:37 ` Noam Postavsky
0 siblings, 1 reply; 28+ messages in thread
From: Michael Heerdegen @ 2020-11-09 20:31 UTC (permalink / raw)
To: help-gnu-emacs
Noam Postavsky <npostavs@gmail.com> writes:
> It's not a program, just a replacement for the '(nil t always nil)
> literal I put in my suggestion.
But isn't meant to be used in the code?
Michael.
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 20:10 ` Michael Heerdegen
@ 2020-11-09 20:35 ` Christopher Dimech
2020-11-09 21:18 ` Michael Heerdegen
0 siblings, 1 reply; 28+ messages in thread
From: Christopher Dimech @ 2020-11-09 20:35 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: Help Gnu Emacs
It can always start from the first item in the list. Then I can
check if (eq last-command this-command). That is, if the user calls
same command it will cycle. Can start with the first item in the list,
and when I get to the last, get back to the beginning.
> Sent: Monday, November 09, 2020 at 9:10 PM
> From: "Michael Heerdegen" <michael_heerdegen@web.de>
> To: "Christopher Dimech" <dimech@gmx.com>
> Cc: "Help Gnu Emacs" <help-gnu-emacs@gnu.org>
> Subject: Re: Cycle Org Shift Select
>
> Christopher Dimech <dimech@gmx.com> writes:
>
> > I have this code to cycle the Shift Select option for Org Mode.
> >
> > I am a little concerned that (nconc Shftsel Shftsel) will continually
> > append, rather than just cycle through the list.
> >
> > Looking for a better way to this job.
>
> What behavior do you want to get? Do you want to cycling to start
> always from the same point and cycle only for repeated commands
> invocations?
>
> Or do you want to have a state remembered by the command (I guess so)?
> Should this then really be a global or a per-buffer or per-window state?
>
>
> Regards,
>
> Michael.
>
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 20:31 ` Michael Heerdegen
@ 2020-11-09 20:37 ` Noam Postavsky
2020-11-09 21:08 ` Michael Heerdegen
0 siblings, 1 reply; 28+ messages in thread
From: Noam Postavsky @ 2020-11-09 20:37 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: Help Gnu Emacs mailing list
On Mon, 9 Nov 2020 at 15:31, Michael Heerdegen <michael_heerdegen@web.de> wrote:
> But isn't meant to be used in the code?
It's meant like this:
(defun Org-Shftsel-Cycle ()
;; Switches between options to org-support-shift-select
(interactive)
(setq org-support-shift-select
(cadr (memq org-support-shift-select '#1=(nil t always . #1#)))))
If you are uncomfortable with the circular syntax, then using '(nil t
always nil) instead, as in my first post, is effectively the same
(i.e., you don't really need a circular list here anyway). I don't
understand your comments about local variables or closures though.
https://lists.gnu.org/archive/html/help-gnu-emacs/2020-11/msg00298.html
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 20:13 ` Michael Heerdegen
2020-11-09 20:26 ` Noam Postavsky
@ 2020-11-09 20:40 ` Christopher Dimech
2020-11-09 20:42 ` Noam Postavsky
2020-11-09 22:49 ` Christopher Dimech
1 sibling, 2 replies; 28+ messages in thread
From: Christopher Dimech @ 2020-11-09 20:40 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: help-gnu-emacs
It cannot be 'nil t always'. Got to introduce nil between
t and always because the user will have no way to figure out
if the Org Shift Select was changed.
> Sent: Monday, November 09, 2020 at 9:13 PM
> From: "Michael Heerdegen" <michael_heerdegen@web.de>
> To: help-gnu-emacs@gnu.org
> Subject: Re: Cycle Org Shift Select
>
> Noam Postavsky <npostavs@gmail.com> writes:
>
> > '#1=(nil t always . #1#)
>
> I once have been told that circular programs are problematic. Today I
> would prefer the use of a (maybe buffer local) helper variable (or, if
> it's only in my init file, simply maybe make the command a closure).
>
> Regards,
>
> Michael.
>
>
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 20:40 ` Christopher Dimech
@ 2020-11-09 20:42 ` Noam Postavsky
2020-11-09 20:52 ` Christopher Dimech
2020-11-09 22:49 ` Christopher Dimech
1 sibling, 1 reply; 28+ messages in thread
From: Noam Postavsky @ 2020-11-09 20:42 UTC (permalink / raw)
To: Christopher Dimech; +Cc: Michael Heerdegen, Help Gnu Emacs mailing list
On Mon, 9 Nov 2020 at 15:40, Christopher Dimech <dimech@gmx.com> wrote:
>
> It cannot be 'nil t always'. Got to introduce nil between
> t and always because the user will have no way to figure out
> if the Org Shift Select was changed.
Why not just add a message?
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 20:42 ` Noam Postavsky
@ 2020-11-09 20:52 ` Christopher Dimech
2020-11-09 20:53 ` Noam Postavsky
0 siblings, 1 reply; 28+ messages in thread
From: Christopher Dimech @ 2020-11-09 20:52 UTC (permalink / raw)
To: Noam Postavsky; +Cc: Michael Heerdegen, Help Gnu Emacs mailing list
I have thought about that but how do I keep track of which one was selected in the list?
> Sent: Monday, November 09, 2020 at 9:42 PM
> From: "Noam Postavsky" <npostavs@gmail.com>
> To: "Christopher Dimech" <dimech@gmx.com>
> Cc: "Michael Heerdegen" <michael_heerdegen@web.de>, "Help Gnu Emacs mailing list" <help-gnu-emacs@gnu.org>
> Subject: Re: Cycle Org Shift Select
>
> On Mon, 9 Nov 2020 at 15:40, Christopher Dimech <dimech@gmx.com> wrote:
> >
> > It cannot be 'nil t always'. Got to introduce nil between
> > t and always because the user will have no way to figure out
> > if the Org Shift Select was changed.
>
> Why not just add a message?
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 20:52 ` Christopher Dimech
@ 2020-11-09 20:53 ` Noam Postavsky
2020-11-09 21:20 ` Michael Heerdegen
2020-11-09 21:45 ` Christopher Dimech
0 siblings, 2 replies; 28+ messages in thread
From: Noam Postavsky @ 2020-11-09 20:53 UTC (permalink / raw)
To: Christopher Dimech; +Cc: Michael Heerdegen, Help Gnu Emacs mailing list
On Mon, 9 Nov 2020 at 15:52, Christopher Dimech <dimech@gmx.com> wrote:
>
> how do I keep track of which one was selected in the list?
The value of org-support-shift-select tells you that.
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 20:37 ` Noam Postavsky
@ 2020-11-09 21:08 ` Michael Heerdegen
2020-11-09 21:19 ` Noam Postavsky
0 siblings, 1 reply; 28+ messages in thread
From: Michael Heerdegen @ 2020-11-09 21:08 UTC (permalink / raw)
To: Noam Postavsky; +Cc: Help Gnu Emacs mailing list
Noam Postavsky <npostavs@gmail.com> writes:
> If you are uncomfortable with the circular syntax [...]
In my case it was not me but a code walker that had been uncomfortable...
> then using '(nil t
> always nil) instead, as in my first post, is effectively the same
> (i.e., you don't really need a circular list here anyway). I don't
> understand your comments about local variables or closures though.
>
> https://lists.gnu.org/archive/html/help-gnu-emacs/2020-11/msg00298.html
I suggested to use a variable or a closure to remember the state of
cycling instead of self-modifying code.
Michael.
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 20:35 ` Christopher Dimech
@ 2020-11-09 21:18 ` Michael Heerdegen
0 siblings, 0 replies; 28+ messages in thread
From: Michael Heerdegen @ 2020-11-09 21:18 UTC (permalink / raw)
To: Christopher Dimech; +Cc: Help Gnu Emacs
Christopher Dimech <dimech@gmx.com> writes:
> It can always start from the first item in the list. Then I can
> check if (eq last-command this-command). That is, if the user calls
> same command it will cycle. Can start with the first item in the list,
> and when I get to the last, get back to the beginning.
I would just use a special variable (defined globally with `defvar') to
store your cyclic list.
Then your command can just `pop' to get the next state. If you want the
command can reinitialize the variable if (not (eq last-command
this-command)).
Michael.
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 21:08 ` Michael Heerdegen
@ 2020-11-09 21:19 ` Noam Postavsky
0 siblings, 0 replies; 28+ messages in thread
From: Noam Postavsky @ 2020-11-09 21:19 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: Help Gnu Emacs mailing list
On Mon, 9 Nov 2020 at 16:08, Michael Heerdegen <michael_heerdegen@web.de> wrote:
> I suggested to use a variable or a closure to remember the state of
> cycling instead of self-modifying code.
"No constants were destructively modified"® in the evaluation of my code :)
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 20:53 ` Noam Postavsky
@ 2020-11-09 21:20 ` Michael Heerdegen
2020-11-09 21:25 ` Noam Postavsky
2020-11-09 21:45 ` Christopher Dimech
1 sibling, 1 reply; 28+ messages in thread
From: Michael Heerdegen @ 2020-11-09 21:20 UTC (permalink / raw)
To: help-gnu-emacs
Noam Postavsky <npostavs@gmail.com> writes:
> > how do I keep track of which one was selected in the list?
>
> The value of org-support-shift-select tells you that.
Maybe that variable is even enough to get rid of the cyclic list?
Michael.
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 21:20 ` Michael Heerdegen
@ 2020-11-09 21:25 ` Noam Postavsky
2020-11-09 21:36 ` Michael Heerdegen
0 siblings, 1 reply; 28+ messages in thread
From: Noam Postavsky @ 2020-11-09 21:25 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: Help Gnu Emacs mailing list
On Mon, 9 Nov 2020 at 16:20, Michael Heerdegen <michael_heerdegen@web.de> wrote:
>
> Noam Postavsky <npostavs@gmail.com> writes:
>
> > > how do I keep track of which one was selected in the list?
> >
> > The value of org-support-shift-select tells you that.
>
> Maybe that variable is even enough to get rid of the cyclic list?
I already showed how to get rid of the cyclic list, in fact my first
example didn't use a cyclic list.
https://lists.gnu.org/archive/html/help-gnu-emacs/2020-11/msg00298.html
(non-cyclic)
https://lists.gnu.org/archive/html/help-gnu-emacs/2020-11/msg00305.html (cyclic)
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 21:25 ` Noam Postavsky
@ 2020-11-09 21:36 ` Michael Heerdegen
0 siblings, 0 replies; 28+ messages in thread
From: Michael Heerdegen @ 2020-11-09 21:36 UTC (permalink / raw)
To: Noam Postavsky; +Cc: Help Gnu Emacs mailing list
Noam Postavsky <npostavs@gmail.com> writes:
> I already showed how to get rid of the cyclic list, in fact my first
> example didn't use a cyclic list.
>
> https://lists.gnu.org/archive/html/help-gnu-emacs/2020-11/msg00298.html
> (non-cyclic)
Yes I know, it's just...late. And I'm trying to find out why my Emacs
is using 7 GB of memory (Bug#43389), and I have no clue how to do that.
If you have any hints... it will not take long until the thing starts
swapping.
Regards,
Michael.
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 20:53 ` Noam Postavsky
2020-11-09 21:20 ` Michael Heerdegen
@ 2020-11-09 21:45 ` Christopher Dimech
2020-11-09 21:49 ` Noam Postavsky
2020-11-09 21:50 ` Michael Heerdegen
1 sibling, 2 replies; 28+ messages in thread
From: Christopher Dimech @ 2020-11-09 21:45 UTC (permalink / raw)
To: Noam Postavsky; +Cc: Michael Heerdegen, Help Gnu Emacs mailing list
Aw having trouble printing the value of org-support-shift-select
in the mini-buffer.
> Sent: Monday, November 09, 2020 at 9:53 PM
> From: "Noam Postavsky" <npostavs@gmail.com>
> To: "Christopher Dimech" <dimech@gmx.com>
> Cc: "Michael Heerdegen" <michael_heerdegen@web.de>, "Help Gnu Emacs mailing list" <help-gnu-emacs@gnu.org>
> Subject: Re: Cycle Org Shift Select
>
> On Mon, 9 Nov 2020 at 15:52, Christopher Dimech <dimech@gmx.com> wrote:
> >
> > how do I keep track of which one was selected in the list?
>
> The value of org-support-shift-select tells you that.
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 21:45 ` Christopher Dimech
@ 2020-11-09 21:49 ` Noam Postavsky
2020-11-09 21:50 ` Michael Heerdegen
1 sibling, 0 replies; 28+ messages in thread
From: Noam Postavsky @ 2020-11-09 21:49 UTC (permalink / raw)
To: Christopher Dimech; +Cc: Michael Heerdegen, Help Gnu Emacs mailing list
On Mon, 9 Nov 2020 at 16:45, Christopher Dimech <dimech@gmx.com> wrote:
>
> Aw having trouble printing the value of org-support-shift-select
> in the mini-buffer.
Doesn't (message "org-support-shift-select = %S" org-support-shift-select) work?
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 21:45 ` Christopher Dimech
2020-11-09 21:49 ` Noam Postavsky
@ 2020-11-09 21:50 ` Michael Heerdegen
2020-11-09 21:59 ` Christopher Dimech
1 sibling, 1 reply; 28+ messages in thread
From: Michael Heerdegen @ 2020-11-09 21:50 UTC (permalink / raw)
To: Christopher Dimech; +Cc: Help Gnu Emacs mailing list, Noam Postavsky
Christopher Dimech <dimech@gmx.com> writes:
> Aw having trouble printing the value of org-support-shift-select
> in the mini-buffer.
(message "org-support-shift-select: %S" org-support-shift-select)
See `format' docstring for the meaning of the % sequences.
Michael.
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 21:50 ` Michael Heerdegen
@ 2020-11-09 21:59 ` Christopher Dimech
0 siblings, 0 replies; 28+ messages in thread
From: Christopher Dimech @ 2020-11-09 21:59 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: Help Gnu Emacs mailing list, Noam Postavsky
Had used (message org-support-shift-select) and that didn't
show up.
> Sent: Monday, November 09, 2020 at 10:50 PM
> From: "Michael Heerdegen" <michael_heerdegen@web.de>
> To: "Christopher Dimech" <dimech@gmx.com>
> Cc: "Noam Postavsky" <npostavs@gmail.com>, "Help Gnu Emacs mailing list" <help-gnu-emacs@gnu.org>
> Subject: Re: Cycle Org Shift Select
>
> Christopher Dimech <dimech@gmx.com> writes:
>
> > Aw having trouble printing the value of org-support-shift-select
> > in the mini-buffer.
>
> (message "org-support-shift-select: %S" org-support-shift-select)
>
> See `format' docstring for the meaning of the % sequences.
>
> Michael.
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 20:40 ` Christopher Dimech
2020-11-09 20:42 ` Noam Postavsky
@ 2020-11-09 22:49 ` Christopher Dimech
2020-11-10 8:08 ` tomas
1 sibling, 1 reply; 28+ messages in thread
From: Christopher Dimech @ 2020-11-09 22:49 UTC (permalink / raw)
To: Christopher Dimech; +Cc: Michael Heerdegen, help-gnu-emacs
What is the meaning of the '.' in '#1=(nil t always . #1#)?
> Sent: Monday, November 09, 2020 at 9:40 PM
> From: "Christopher Dimech" <dimech@gmx.com>
> To: "Michael Heerdegen" <michael_heerdegen@web.de>
> Cc: help-gnu-emacs@gnu.org
> Subject: Re: Cycle Org Shift Select
>
> It cannot be 'nil t always'. Got to introduce nil between
> t and always because the user will have no way to figure out
> if the Org Shift Select was changed.
>
>
> > Sent: Monday, November 09, 2020 at 9:13 PM
> > From: "Michael Heerdegen" <michael_heerdegen@web.de>
> > To: help-gnu-emacs@gnu.org
> > Subject: Re: Cycle Org Shift Select
> >
> > Noam Postavsky <npostavs@gmail.com> writes:
> >
> > > '#1=(nil t always . #1#)
> >
> > I once have been told that circular programs are problematic. Today I
> > would prefer the use of a (maybe buffer local) helper variable (or, if
> > it's only in my init file, simply maybe make the command a closure).
> >
> > Regards,
> >
> > Michael.
> >
> >
> >
>
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-09 22:49 ` Christopher Dimech
@ 2020-11-10 8:08 ` tomas
2020-11-10 10:17 ` Christopher Dimech
0 siblings, 1 reply; 28+ messages in thread
From: tomas @ 2020-11-10 8:08 UTC (permalink / raw)
To: help-gnu-emacs
[-- Attachment #1: Type: text/plain, Size: 1826 bytes --]
On Mon, Nov 09, 2020 at 11:49:33PM +0100, Christopher Dimech wrote:
> What is the meaning of the '.' in '#1=(nil t always . #1#)?
This means that the last cdr in that list isn't nil, as "decent,
normal lists" (aka "proper lists") have, but a reference to something,
in this case to the list's head (#1#), which you have taken previously,
in #1=. Making the whole thing an Ouroboros [1].
In box-and-pointer-ish, the list '(nil t always) looks like so
(WARNING: psychedelic effects guaranteed when using variable-pitch
fonts. But who does that, anyway?):
+-----+--+ +--+--+ +--+-----+
| nil | | ---> | | | ---> | | nil |
+-----+--+ +--+--+ +--+-----+
| |
v v
't 'always
Note how the list ends with a pair whose cdr is nil.
The dot notation allows you to fill both slots of a pair (car
and cdr), thus putting something other than the "link to next"
in a cdr, creating an improper list; the reference notation
(that #...= and #...#) allows you to take a ref at some place
and use it later. That's what your above monster looks like
in box-and-pointer:
+---------------------------------+
| |
v |
+-----+--+ +--+--+ +--+--+ |
| nil | | ---> | | | ---> | | | ---+
+-----+--+ +--+--+ +--+--+
| |
v v
't 'always
So if you run *that* list along (by doing cdr), you'll run
in circles, over and over again. That was this device's
intention, anyway, if I followed along correctly.
Cheers
[1] https://en.wikipedia.org/wiki/Ouroboros
- t
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-10 8:08 ` tomas
@ 2020-11-10 10:17 ` Christopher Dimech
2020-11-10 11:10 ` Michael Heerdegen
0 siblings, 1 reply; 28+ messages in thread
From: Christopher Dimech @ 2020-11-10 10:17 UTC (permalink / raw)
To: tomas; +Cc: help-gnu-emacs
Many thanks Tomas, have gone though the Elisp Manual yesterday
and I am getting to understand this list Ouroboros thing. :)
> Sent: Tuesday, November 10, 2020 at 9:08 AM
> From: tomas@tuxteam.de
> To: help-gnu-emacs@gnu.org
> Subject: Re: Cycle Org Shift Select
>
> On Mon, Nov 09, 2020 at 11:49:33PM +0100, Christopher Dimech wrote:
> > What is the meaning of the '.' in '#1=(nil t always . #1#)?
>
> This means that the last cdr in that list isn't nil, as "decent,
> normal lists" (aka "proper lists") have, but a reference to something,
> in this case to the list's head (#1#), which you have taken previously,
> in #1=. Making the whole thing an Ouroboros [1].
>
> In box-and-pointer-ish, the list '(nil t always) looks like so
> (WARNING: psychedelic effects guaranteed when using variable-pitch
> fonts. But who does that, anyway?):
>
> +-----+--+ +--+--+ +--+-----+
> | nil | | ---> | | | ---> | | nil |
> +-----+--+ +--+--+ +--+-----+
> | |
> v v
> 't 'always
>
> Note how the list ends with a pair whose cdr is nil.
>
> The dot notation allows you to fill both slots of a pair (car
> and cdr), thus putting something other than the "link to next"
> in a cdr, creating an improper list; the reference notation
> (that #...= and #...#) allows you to take a ref at some place
> and use it later. That's what your above monster looks like
> in box-and-pointer:
>
> +---------------------------------+
> | |
> v |
> +-----+--+ +--+--+ +--+--+ |
> | nil | | ---> | | | ---> | | | ---+
> +-----+--+ +--+--+ +--+--+
> | |
> v v
> 't 'always
>
>
> So if you run *that* list along (by doing cdr), you'll run
> in circles, over and over again. That was this device's
> intention, anyway, if I followed along correctly.
>
> Cheers
>
> [1] https://en.wikipedia.org/wiki/Ouroboros
> - t
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Cycle Org Shift Select
2020-11-10 10:17 ` Christopher Dimech
@ 2020-11-10 11:10 ` Michael Heerdegen
0 siblings, 0 replies; 28+ messages in thread
From: Michael Heerdegen @ 2020-11-10 11:10 UTC (permalink / raw)
To: help-gnu-emacs
Christopher Dimech <dimech@gmx.com> writes:
> Many thanks Tomas, have gone though the Elisp Manual yesterday
> and I am getting to understand this list Ouroboros thing. :)
If you want a simple way to think about it starting from a syntax point
of view:
A very simple way to think about the dotted syntax is to start from
regular lists. You can write
(elt1 elt2 . rest)
to describe a list of the elements elt1 elt2 (any positive number of
starting elements will do) with the elements in the list `rest'
appended. For example try to eval
'(x y . ())
or
'(x y . (z))
(You need the quote "'" because we don't want to evaluate the lists as
an expression.)
Of course the dot syntax is ambiguous, e.g.
'(x y z)
'(x . (y z))
'(x . (y . (z)))
'(x . (y . (z . ())))
all describe equal three element lists containing the symbols x, y and z.
Then you need to know that the "rest" can be actually anything. If the
`rest' doesn't describe a regular list, you get a "dotted" list (it will
be printed using the dot syntax). In the simplest case
(x . y)
you have a pair, a `cons' cell which is the building block lists are
constructed from in Lisp. A cons with a list cdr is also a list.
And when `rest' refers to the list itself (possible using the # reader
syntax):
'#1=(nil t always . #1#)
you get a circular list.
HTH,
Michael.
^ permalink raw reply [flat|nested] 28+ messages in thread
* RE: Cycle Org Shift Select
2020-11-09 19:12 ` Noam Postavsky
2020-11-09 20:13 ` Michael Heerdegen
@ 2020-11-10 16:37 ` Drew Adams
2020-11-11 17:09 ` Drew Adams
1 sibling, 1 reply; 28+ messages in thread
From: Drew Adams @ 2020-11-10 16:37 UTC (permalink / raw)
To: Noam Postavsky, Christopher Dimech; +Cc: Help Gnu Emacs
> (defun Org-Shftsel-Cycle ()
> (interactive)
> (setq org-support-shift-select
> (cadr (memq org-support-shift-select '(nil t always nil)))))
Elegant Lisp, IMO! A good idiom.
___
Slightly cuter: the last nil isn't needed, since (car nil) = nil.
(defvar toto nil)
(defun foo ()
(interactive)
(setq toto (cadr (memq toto '(nil t always))))
(message "NOW: %s" toto))
Of if you want to show also what'll come next:
(defun foo ()
(interactive)
(let ((xs '(nil t always))
next)
(setq toto (cadr (memq toto xs))
next (cadr (memq toto xs)))
(message "NOW: %s, NEXT: %s" toto next)))
^ permalink raw reply [flat|nested] 28+ messages in thread
* RE: Cycle Org Shift Select
2020-11-10 16:37 ` Drew Adams
@ 2020-11-11 17:09 ` Drew Adams
0 siblings, 0 replies; 28+ messages in thread
From: Drew Adams @ 2020-11-11 17:09 UTC (permalink / raw)
To: Noam Postavsky, Christopher Dimech; +Cc: Help Gnu Emacs
> > (defun Org-Shftsel-Cycle ()
> > (interactive)
> > (setq org-support-shift-select
> > (cadr (memq org-support-shift-select '(nil t always nil)))))
>
> Elegant Lisp, IMO! A good idiom.
> ___
>
>
> Slightly cuter: the last nil isn't needed, since (car nil) = nil.
>
> (defvar toto nil)
>
> (defun foo ()
> (interactive)
> (setq toto (cadr (memq toto '(nil t always))))
> (message "NOW: %s" toto))
>
> Of if you want to show also what'll come next:
>
> (defun foo ()
> (interactive)
> (let ((xs '(nil t always))
> next)
> (setq toto (cadr (memq toto xs))
> next (cadr (memq toto xs)))
> (message "NOW: %s, NEXT: %s" toto next)))
On the other hand, if you want to be able to go either
forward or backward then you might want to use a ring
(as defined in standard library ring.el):
(defvar ring (ring-convert-sequence-to-ring '(nil t always)))
(defvar current nil)
(defun next ()
(interactive)
(setq current (ring-next toto current))
(message "NOW: %s" current))
(defun previous ()
(interactive)
(setq current (ring-previous toto current))
(message "NOW: %s" current))
^ permalink raw reply [flat|nested] 28+ messages in thread
end of thread, other threads:[~2020-11-11 17:09 UTC | newest]
Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-11-06 15:23 Cycle Org Shift Select Christopher Dimech
2020-11-09 19:12 ` Noam Postavsky
2020-11-09 20:13 ` Michael Heerdegen
2020-11-09 20:26 ` Noam Postavsky
2020-11-09 20:31 ` Michael Heerdegen
2020-11-09 20:37 ` Noam Postavsky
2020-11-09 21:08 ` Michael Heerdegen
2020-11-09 21:19 ` Noam Postavsky
2020-11-09 20:40 ` Christopher Dimech
2020-11-09 20:42 ` Noam Postavsky
2020-11-09 20:52 ` Christopher Dimech
2020-11-09 20:53 ` Noam Postavsky
2020-11-09 21:20 ` Michael Heerdegen
2020-11-09 21:25 ` Noam Postavsky
2020-11-09 21:36 ` Michael Heerdegen
2020-11-09 21:45 ` Christopher Dimech
2020-11-09 21:49 ` Noam Postavsky
2020-11-09 21:50 ` Michael Heerdegen
2020-11-09 21:59 ` Christopher Dimech
2020-11-09 22:49 ` Christopher Dimech
2020-11-10 8:08 ` tomas
2020-11-10 10:17 ` Christopher Dimech
2020-11-10 11:10 ` Michael Heerdegen
2020-11-10 16:37 ` Drew Adams
2020-11-11 17:09 ` Drew Adams
2020-11-09 20:10 ` Michael Heerdegen
2020-11-09 20:35 ` Christopher Dimech
2020-11-09 21:18 ` Michael Heerdegen
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).