all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#40570: [PATCH] Alias cl-subseq to seq-subseq, define gv-setter in the latter
@ 2020-04-12  9:46 Štěpán Němec
  2020-04-12 16:18 ` Stefan Monnier
  0 siblings, 1 reply; 4+ messages in thread
From: Štěpán Němec @ 2020-04-12  9:46 UTC (permalink / raw
  To: 40570; +Cc: monnier

The definition was moved in

2019-10-27T13:25:00-04:00!monnier@iro.umontreal.ca
0e4dd67aae (* lisp/emacs-lisp/seq.el: Don't require cl-lib.)

already, but not the gv-setter declaration, so 'setf' worked with
'cl-subseq', but not with 'seq-subseq'.  Moving also the gv-setter to
seq-subseq and defining 'cl-subseq' as an alias of the former makes
'setf' work with both.

* lisp/emacs-lisp/cl-extra.el (cl-subseq): Redefine as an alias of
'seq-subseq'.

* lisp/emacs-lisp/seq.el (seq-subseq): Move gv-setter declaration here
from 'cl-subseq' so that 'setf' works.
---
 lisp/emacs-lisp/cl-extra.el | 12 +++---------
 lisp/emacs-lisp/seq.el      |  5 +++++
 2 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/lisp/emacs-lisp/cl-extra.el b/lisp/emacs-lisp/cl-extra.el
index 5bf74792c0..2583fdb19e 100644
--- a/lisp/emacs-lisp/cl-extra.el
+++ b/lisp/emacs-lisp/cl-extra.el
@@ -538,18 +538,12 @@ cl-float-limits
 ;;; Sequence functions.
 
 ;;;###autoload
-(defun cl-subseq (seq start &optional end)
-  "Return the subsequence of SEQ from START to END.
+(defalias 'cl-subseq #'seq-subseq
+  "Return the subsequence of SEQUENCE from START to END.
 If END is omitted, it defaults to the length of the sequence.
 If START or END is negative, it counts from the end.
 Signal an error if START or END are outside of the sequence (i.e
-too large if positive or too small if negative)."
-  (declare (gv-setter
-            (lambda (new)
-              (macroexp-let2 nil new new
-		`(progn (cl-replace ,seq ,new :start1 ,start :end1 ,end)
-			,new)))))
-  (seq-subseq seq start end))
+too large if positive or too small if negative).")
 
 ;;;###autoload
 (defalias 'cl-concatenate #'seq-concatenate
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index e3037a7190..936c38283e 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -154,6 +154,11 @@ seq-subseq
 START or END is negative, it counts from the end.  Signal an
 error if START or END are outside of the sequence (i.e too large
 if positive or too small if negative)."
+  (declare (gv-setter
+            (lambda (new)
+              (macroexp-let2 nil new new
+		`(progn (cl-replace ,sequence ,new :start1 ,start :end1 ,end)
+			,new)))))
   (cond
    ((or (stringp sequence) (vectorp sequence)) (substring sequence start end))
    ((listp sequence)
-- 
2.26.0






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

* bug#40570: [PATCH] Alias cl-subseq to seq-subseq, define gv-setter in the latter
  2020-04-12  9:46 bug#40570: [PATCH] Alias cl-subseq to seq-subseq, define gv-setter in the latter Štěpán Němec
@ 2020-04-12 16:18 ` Stefan Monnier
  2020-04-12 17:16   ` Štěpán Němec
  0 siblings, 1 reply; 4+ messages in thread
From: Stefan Monnier @ 2020-04-12 16:18 UTC (permalink / raw
  To: Štěpán Němec; +Cc: 40570

> The definition was moved in
>
> 2019-10-27T13:25:00-04:00!monnier@iro.umontreal.ca
> 0e4dd67aae (* lisp/emacs-lisp/seq.el: Don't require cl-lib.)
>
> already, but not the gv-setter declaration, so 'setf' worked with
> 'cl-subseq', but not with 'seq-subseq'.

Indeed, when I made the move I just wanted to change the implementation
but not the featureset (AFAIK seq-subseq never supported `setf`).

So this bug report is fundamentally a feature request: make `seq-subseq`
into a (gv) generalized variable.

> --- a/lisp/emacs-lisp/seq.el
> +++ b/lisp/emacs-lisp/seq.el
> @@ -154,6 +154,11 @@ seq-subseq
>  START or END is negative, it counts from the end.  Signal an
>  error if START or END are outside of the sequence (i.e too large
>  if positive or too small if negative)."
> +  (declare (gv-setter
> +            (lambda (new)
> +              (macroexp-let2 nil new new
> +		`(progn (cl-replace ,sequence ,new :start1 ,start :end1 ,end)
> +			,new)))))

The main purpose of the move was to reverse the order of dependency so
that `cl-lib` would depend on `seq` rather than the reverse.
This implies that `seq` shouldn't use `cl-lib`.  The above `cl-replace`
is hence problematic.

Another issue is that `seq-subseq` is a generic function, so its
gv-setter should also use generic functions so that it can also be made
to work on other sequence types than the predefined ones.

IOW we should probably introduce a new `seq` generic function which does
something similar to `cl-replace`, then make `seq-subseq` use it in its
gv-setter, and ideally also make `cl-replace` use it ;-)


        Stefan






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

* bug#40570: [PATCH] Alias cl-subseq to seq-subseq, define gv-setter in the latter
  2020-04-12 16:18 ` Stefan Monnier
@ 2020-04-12 17:16   ` Štěpán Němec
  2020-04-12 19:18     ` Stefan Monnier
  0 siblings, 1 reply; 4+ messages in thread
From: Štěpán Němec @ 2020-04-12 17:16 UTC (permalink / raw
  To: Stefan Monnier; +Cc: 40570-done

On Sun, 12 Apr 2020 12:18:15 -0400
Stefan Monnier wrote:

>> The definition was moved in
>>
>> 2019-10-27T13:25:00-04:00!monnier@iro.umontreal.ca
>> 0e4dd67aae (* lisp/emacs-lisp/seq.el: Don't require cl-lib.)
>>
>> already, but not the gv-setter declaration, so 'setf' worked with
>> 'cl-subseq', but not with 'seq-subseq'.
>
> Indeed, when I made the move I just wanted to change the implementation
> but not the featureset (AFAIK seq-subseq never supported `setf`).
>
> So this bug report is fundamentally a feature request: make `seq-subseq`
> into a (gv) generalized variable.
>
>> --- a/lisp/emacs-lisp/seq.el
>> +++ b/lisp/emacs-lisp/seq.el
>> @@ -154,6 +154,11 @@ seq-subseq
>>  START or END is negative, it counts from the end.  Signal an
>>  error if START or END are outside of the sequence (i.e too large
>>  if positive or too small if negative)."
>> +  (declare (gv-setter
>> +            (lambda (new)
>> +              (macroexp-let2 nil new new
>> +		`(progn (cl-replace ,sequence ,new :start1 ,start :end1 ,end)
>> +			,new)))))
>
> The main purpose of the move was to reverse the order of dependency so
> that `cl-lib` would depend on `seq` rather than the reverse.
> This implies that `seq` shouldn't use `cl-lib`.  The above `cl-replace`
> is hence problematic.

Oh, right... sorry.

> Another issue is that `seq-subseq` is a generic function, so its
> gv-setter should also use generic functions so that it can also be made
> to work on other sequence types than the predefined ones.
>
> IOW we should probably introduce a new `seq` generic function which does
> something similar to `cl-replace`, then make `seq-subseq` use it in its
> gv-setter, and ideally also make `cl-replace` use it ;-)

Indeed. The definition of `cl-replace' looks like not for the faint of
heart, also a lot of that impression comes from all the cl- prefixed
args and variables. Is that just an artifact of some automatic
replacement process, or is there a reason those have to have the cl-
prefix? Or a conspiracy to make cl-*.el even more impenetrable?

-- 
Štěpán





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

* bug#40570: [PATCH] Alias cl-subseq to seq-subseq, define gv-setter in the latter
  2020-04-12 17:16   ` Štěpán Němec
@ 2020-04-12 19:18     ` Stefan Monnier
  0 siblings, 0 replies; 4+ messages in thread
From: Stefan Monnier @ 2020-04-12 19:18 UTC (permalink / raw
  To: Štěpán Němec; +Cc: 40570-done

> Indeed. The definition of `cl-replace' looks like not for the faint of
> heart, also a lot of that impression comes from all the cl- prefixed
> args and variables. Is that just an artifact of some automatic
> replacement process, or is there a reason those have to have the cl-
> prefix?

IIRC it's just a remnant of the dynamic scoping days where higher-order
functions needed to obfuscate their local var names to avoid accident
name capture.

`cl` used it fairly systematically (not just when and where needed).

IIRC I did remove this prefix in a number of places (and kept it at
a few places where those vars are actually accessed via dynamic
scoping), but I'm sure there are lots more to clean up.


        Stefan






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

end of thread, other threads:[~2020-04-12 19:18 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-04-12  9:46 bug#40570: [PATCH] Alias cl-subseq to seq-subseq, define gv-setter in the latter Štěpán Němec
2020-04-12 16:18 ` Stefan Monnier
2020-04-12 17:16   ` Štěpán Němec
2020-04-12 19:18     ` Stefan Monnier

Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.