* Oddities with dynamic modules @ 2018-10-11 18:12 Eli Zaretskii 2018-10-12 14:29 ` Kaushal Modi 2019-02-10 20:23 ` Philipp Stephani 0 siblings, 2 replies; 30+ messages in thread From: Eli Zaretskii @ 2018-10-11 18:12 UTC (permalink / raw) To: emacs-devel Having written the documentation of the module API, I couldn't help but notice a few oddities about its repertory. I list below the issues that caused me to raise a brow, for the record: . Why do we have functions to access vectors, but not functions to access lists? I always thought lists were more important for Emacs than vectors. If we are asking users to use 'intern' to access 'car' and 'cdr', why not 'aref' and 'aset'? . Why aren't there API functions to _create_ lists and vectors? . Using 'funcall' is unnecessarily cumbersome, because the function to be called is passed as an 'emacs_value'. Why don't we have a variant that just accepts a name of a Lisp-callable function as a C string? . Why does 'intern' only handle pure ASCII symbol names? It's not like supporting non-ASCII names is hard. . I could understand why equality predicates are not provided in the API, but I don't understand why we do provide 'eq' there. Is it that much more important than the other predicates? IOW, if the API was supposed to be minimal, it looks like it isn't; and if it wasn't supposed to be minimal, then some important/popular functions are strangely missing, for reasons I couldn't wrap my head around. Thanks. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2018-10-11 18:12 Oddities with dynamic modules Eli Zaretskii @ 2018-10-12 14:29 ` Kaushal Modi 2019-02-10 20:23 ` Philipp Stephani 1 sibling, 0 replies; 30+ messages in thread From: Kaushal Modi @ 2018-10-12 14:29 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Emacs developers On Thu, Oct 11, 2018 at 2:14 PM Eli Zaretskii <eliz@gnu.org> wrote: > > Having written the documentation of the module API, Thanks for writing up all that documentation! https://git.savannah.gnu.org/cgit/emacs.git/commit/?h=emacs-26&id=ce8b4584a3c69e5c4abad8a0a9c3781ce8c0c1f8 I am not in the capacity to comment on most of your questions as I am using the Modules feature to get around my lack of C knowledge :) > . Why aren't there API functions to _create_ lists and vectors? > > . Using 'funcall' is unnecessarily cumbersome, because the function > to be called is passed as an 'emacs_value'. Why don't we have a > variant that just accepts a name of a Lisp-callable function as a C > string? +1 I needed to create some sugar syntax in Nim (which compiles to C) to get around that limitation: proc MakeList*(env: ptr emacs_env; listArray: openArray[emacs_value]): emacs_value = ## Return an Emacs-Lisp ``list``. Funcall(env, "list", listArray) proc MakeCons*(env: ptr emacs_env; consCar, consCdr: emacs_value): emacs_value = ## Return an Emacs-Lisp ``cons``. Funcall(env, "cons", [consCar, consCdr]) It would be nice to have API for list (and cons). > . Why does 'intern' only handle pure ASCII symbol names? It's not > like supporting non-ASCII names is hard. > > . I could understand why equality predicates are not provided in the > API, but I don't understand why we do provide 'eq' there. Is it > that much more important than the other predicates? I had the same question too. I find equal more useful than eq. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2018-10-11 18:12 Oddities with dynamic modules Eli Zaretskii 2018-10-12 14:29 ` Kaushal Modi @ 2019-02-10 20:23 ` Philipp Stephani 2019-02-11 15:45 ` Eli Zaretskii 1 sibling, 1 reply; 30+ messages in thread From: Philipp Stephani @ 2019-02-10 20:23 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Emacs developers Am Do., 11. Okt. 2018 um 20:13 Uhr schrieb Eli Zaretskii <eliz@gnu.org>: > > Having written the documentation of the module API, I couldn't help > but notice a few oddities about its repertory. I list below the > issues that caused me to raise a brow, for the record: > > . Why do we have functions to access vectors, but not functions to > access lists? I always thought lists were more important for Emacs > than vectors. If we are asking users to use 'intern' to access > 'car' and 'cdr', why not 'aref' and 'aset'? > > . Why aren't there API functions to _create_ lists and vectors? I guess these are mostly historical. These were introduced in https://github.com/aaptel/emacs-dynamic-module/commit/016e8b6ffdfb861806957bb84c419a3d65caedb7, but I don't remember the background. > > . Using 'funcall' is unnecessarily cumbersome, because the function > to be called is passed as an 'emacs_value'. Why don't we have a > variant that just accepts a name of a Lisp-callable function as a C > string? Convenience is not a design goal of the module API. The primary design goals are robustness, stability, simplicity, and minimalism. > > . Why does 'intern' only handle pure ASCII symbol names? It's not > like supporting non-ASCII names is hard. Unfortunately it is, due to Emacs underspecifying encoding. If we can manage to write an 'intern' function that accepts UTF-8 strings and only UTF-8 strings, I'm all for it. > > . I could understand why equality predicates are not provided in the > API, but I don't understand why we do provide 'eq' there. Is it > that much more important than the other predicates? Yes, it represents a fundamental property of objects. > > IOW, if the API was supposed to be minimal, it looks like it isn't; > and if it wasn't supposed to be minimal, then some important/popular > functions are strangely missing, for reasons I couldn't wrap my head > around. It is *mostly* minimal. A *completely* minimal API would not even have integer and floating-point conversion functions, as those can be written using the string functions. But that would be far less simple and robust. "eq" and "is_not_nil" are special in that they implement access to fundamental object properties and can't fail, so they are fundamental enough to deserve an entry in the module table. The best source to answer the "why" questions is still the original design document: https://lists.gnu.org/archive/html/emacs-devel/2015-02/msg00960.html ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2019-02-10 20:23 ` Philipp Stephani @ 2019-02-11 15:45 ` Eli Zaretskii 2019-02-11 16:04 ` Yuri Khan 2019-03-21 20:12 ` Philipp Stephani 0 siblings, 2 replies; 30+ messages in thread From: Eli Zaretskii @ 2019-02-11 15:45 UTC (permalink / raw) To: Philipp Stephani; +Cc: emacs-devel > From: Philipp Stephani <p.stephani2@gmail.com> > Date: Sun, 10 Feb 2019 21:23:18 +0100 > Cc: Emacs developers <emacs-devel@gnu.org> > > > . Using 'funcall' is unnecessarily cumbersome, because the function > > to be called is passed as an 'emacs_value'. Why don't we have a > > variant that just accepts a name of a Lisp-callable function as a C > > string? > > Convenience is not a design goal of the module API. The primary design > goals are robustness, stability, simplicity, and minimalism. I thought simplicity and convenience of use tramps simplicity of the implementation, so it is strange to read arguments to the contrary. IME, inconvenient interfaces are the main reason for them being unstable, but that's me. > > . Why does 'intern' only handle pure ASCII symbol names? It's not > > like supporting non-ASCII names is hard. > > Unfortunately it is, due to Emacs underspecifying encoding. If we can > manage to write an 'intern' function that accepts UTF-8 strings and > only UTF-8 strings, I'm all for it. What are the problems you have in mind? After all, this is already possible by means of 2 more function calls, as the example in the manual shows. Are there any problems to do the same under the hood, instead of requiring users to do that explicitly in their module code? > > . I could understand why equality predicates are not provided in the > > API, but I don't understand why we do provide 'eq' there. Is it > > that much more important than the other predicates? > > Yes, it represents a fundamental property of objects. How is that relevant? Equality predicates are used very frequently when dealing with Lisp objects; 'eq' is not different from others in that respect. > > IOW, if the API was supposed to be minimal, it looks like it isn't; > > and if it wasn't supposed to be minimal, then some important/popular > > functions are strangely missing, for reasons I couldn't wrap my head > > around. > > It is *mostly* minimal. A *completely* minimal API would not even have > integer and floating-point conversion functions, as those can be > written using the string functions. But that would be far less simple > and robust. > "eq" and "is_not_nil" are special in that they implement access to > fundamental object properties and can't fail, so they are fundamental > enough to deserve an entry in the module table. I cannot follow this reasoning, sorry. It sounds like you are saying that the decision what to implement and what not justifies itself because it's there. All I can say is that as someone who wrote a couple of lines of code in Emacs, the stuff that is in the API and the omissions look quite arbitrary to me. > The best source to answer the "why" questions is still the original > design document: > https://lists.gnu.org/archive/html/emacs-devel/2015-02/msg00960.html Which part(s) of that long document answer these questions, please? ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2019-02-11 15:45 ` Eli Zaretskii @ 2019-02-11 16:04 ` Yuri Khan 2019-03-21 20:04 ` Philipp Stephani 2019-03-21 20:12 ` Philipp Stephani 1 sibling, 1 reply; 30+ messages in thread From: Yuri Khan @ 2019-02-11 16:04 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Philipp Stephani, Emacs developers On Mon, Feb 11, 2019 at 10:46 PM Eli Zaretskii <eliz@gnu.org> wrote: > > Convenience is not a design goal of the module API. The primary design > > goals are robustness, stability, simplicity, and minimalism. > > I thought simplicity and convenience of use tramps simplicity of the > implementation, so it is strange to read arguments to the contrary. > IME, inconvenient interfaces are the main reason for them being > unstable, but that's me. A good middle ground is a minimalistic (but sufficient) API at the host side, plus idiomatic convenience wrapper libraries for each client language. (The latter need not be maintained by the host API maintainer.) ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2019-02-11 16:04 ` Yuri Khan @ 2019-03-21 20:04 ` Philipp Stephani 2019-03-21 20:17 ` Eli Zaretskii 0 siblings, 1 reply; 30+ messages in thread From: Philipp Stephani @ 2019-03-21 20:04 UTC (permalink / raw) To: Yuri Khan; +Cc: Eli Zaretskii, Emacs developers Am Mo., 11. Feb. 2019 um 17:04 Uhr schrieb Yuri Khan <yurivkhan@gmail.com>: > > On Mon, Feb 11, 2019 at 10:46 PM Eli Zaretskii <eliz@gnu.org> wrote: > > > > Convenience is not a design goal of the module API. The primary design > > > goals are robustness, stability, simplicity, and minimalism. > > > > I thought simplicity and convenience of use tramps simplicity of the > > implementation, so it is strange to read arguments to the contrary. > > IME, inconvenient interfaces are the main reason for them being > > unstable, but that's me. > > A good middle ground is a minimalistic (but sufficient) API at the > host side, plus idiomatic convenience wrapper libraries for each > client language. (The latter need not be maintained by the host API > maintainer.) Yes, that's exactly what Daniel suggested in his initial design. It's also what largely seems to be happening: people have written idiomatic wrappers for Rust, Go, and probably other languages. Thus I'd say this is working as inteded. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2019-03-21 20:04 ` Philipp Stephani @ 2019-03-21 20:17 ` Eli Zaretskii 2019-03-21 20:32 ` Philipp Stephani 0 siblings, 1 reply; 30+ messages in thread From: Eli Zaretskii @ 2019-03-21 20:17 UTC (permalink / raw) To: Philipp Stephani; +Cc: yurivkhan, emacs-devel > From: Philipp Stephani <p.stephani2@gmail.com> > Date: Thu, 21 Mar 2019 21:04:07 +0100 > Cc: Eli Zaretskii <eliz@gnu.org>, Emacs developers <emacs-devel@gnu.org> > > > > I thought simplicity and convenience of use tramps simplicity of the > > > implementation, so it is strange to read arguments to the contrary. > > > IME, inconvenient interfaces are the main reason for them being > > > unstable, but that's me. > > > > A good middle ground is a minimalistic (but sufficient) API at the > > host side, plus idiomatic convenience wrapper libraries for each > > client language. (The latter need not be maintained by the host API > > maintainer.) > > Yes, that's exactly what Daniel suggested in his initial design. It's > also what largely seems to be happening: people have written idiomatic > wrappers for Rust, Go, and probably other languages. Where's the wrapper for C? > Thus I'd say this is working as inteded. I still find it strange (and can already hardly remember what I wrote several months ago, so perhaps try to respond sooner next time?). ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2019-03-21 20:17 ` Eli Zaretskii @ 2019-03-21 20:32 ` Philipp Stephani 2019-03-21 20:46 ` Eli Zaretskii 0 siblings, 1 reply; 30+ messages in thread From: Philipp Stephani @ 2019-03-21 20:32 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Yuri Khan, Emacs developers Am Do., 21. März 2019 um 21:17 Uhr schrieb Eli Zaretskii <eliz@gnu.org>: > > > From: Philipp Stephani <p.stephani2@gmail.com> > > Date: Thu, 21 Mar 2019 21:04:07 +0100 > > Cc: Eli Zaretskii <eliz@gnu.org>, Emacs developers <emacs-devel@gnu.org> > > > > > > I thought simplicity and convenience of use tramps simplicity of the > > > > implementation, so it is strange to read arguments to the contrary. > > > > IME, inconvenient interfaces are the main reason for them being > > > > unstable, but that's me. > > > > > > A good middle ground is a minimalistic (but sufficient) API at the > > > host side, plus idiomatic convenience wrapper libraries for each > > > client language. (The latter need not be maintained by the host API > > > maintainer.) > > > > Yes, that's exactly what Daniel suggested in his initial design. It's > > also what largely seems to be happening: people have written idiomatic > > wrappers for Rust, Go, and probably other languages. > > Where's the wrapper for C? It seems like there isn't enough interest in modules written in C for such a wrapper. Or there is a wrapper and I just don't know about it. The module API is usable as-is, and writing and maintaining a wrapper is nontrivial work. For other languages wrappers are necessary, but C users can use the plain API directly, and that's often a reasonable choice. For example, the FFI module (https://github.com/tromey/emacs-ffi/blob/master/ffi-module.c) is complex enough that a wrapper library probably wouldn't make it much shorter. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2019-03-21 20:32 ` Philipp Stephani @ 2019-03-21 20:46 ` Eli Zaretskii 2019-03-21 20:51 ` Philipp Stephani 0 siblings, 1 reply; 30+ messages in thread From: Eli Zaretskii @ 2019-03-21 20:46 UTC (permalink / raw) To: Philipp Stephani; +Cc: yurivkhan, emacs-devel > From: Philipp Stephani <p.stephani2@gmail.com> > Date: Thu, 21 Mar 2019 21:32:07 +0100 > Cc: Yuri Khan <yurivkhan@gmail.com>, Emacs developers <emacs-devel@gnu.org> > > > > Yes, that's exactly what Daniel suggested in his initial design. It's > > > also what largely seems to be happening: people have written idiomatic > > > wrappers for Rust, Go, and probably other languages. > > > > Where's the wrapper for C? > > It seems like there isn't enough interest in modules written in C for > such a wrapper. I think if we maintain that this is the job for a wrapper, we should have such a wrapper in Emacs. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2019-03-21 20:46 ` Eli Zaretskii @ 2019-03-21 20:51 ` Philipp Stephani 0 siblings, 0 replies; 30+ messages in thread From: Philipp Stephani @ 2019-03-21 20:51 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Yuri Khan, Emacs developers Am Do., 21. März 2019 um 21:46 Uhr schrieb Eli Zaretskii <eliz@gnu.org>: > > > From: Philipp Stephani <p.stephani2@gmail.com> > > Date: Thu, 21 Mar 2019 21:32:07 +0100 > > Cc: Yuri Khan <yurivkhan@gmail.com>, Emacs developers <emacs-devel@gnu.org> > > > > > > Yes, that's exactly what Daniel suggested in his initial design. It's > > > > also what largely seems to be happening: people have written idiomatic > > > > wrappers for Rust, Go, and probably other languages. > > > > > > Where's the wrapper for C? > > > > It seems like there isn't enough interest in modules written in C for > > such a wrapper. > > I think if we maintain that this is the job for a wrapper, we should > have such a wrapper in Emacs. I certainly wouldn't mind having such a wrapper in Emacs core. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2019-02-11 15:45 ` Eli Zaretskii 2019-02-11 16:04 ` Yuri Khan @ 2019-03-21 20:12 ` Philipp Stephani 2019-03-21 20:25 ` Eli Zaretskii 1 sibling, 1 reply; 30+ messages in thread From: Philipp Stephani @ 2019-03-21 20:12 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Emacs developers Am Mo., 11. Feb. 2019 um 16:46 Uhr schrieb Eli Zaretskii <eliz@gnu.org>: > > > From: Philipp Stephani <p.stephani2@gmail.com> > > Date: Sun, 10 Feb 2019 21:23:18 +0100 > > Cc: Emacs developers <emacs-devel@gnu.org> > > > > > . Using 'funcall' is unnecessarily cumbersome, because the function > > > to be called is passed as an 'emacs_value'. Why don't we have a > > > variant that just accepts a name of a Lisp-callable function as a C > > > string? > > > > Convenience is not a design goal of the module API. The primary design > > goals are robustness, stability, simplicity, and minimalism. > > I thought simplicity and convenience of use tramps simplicity of the > implementation, so it is strange to read arguments to the contrary. Simplicity tends to be the opposite of convenience. Interface simplicity definitely trumps convenience and implementation simplicity. > > > > . Why does 'intern' only handle pure ASCII symbol names? It's not > > > like supporting non-ASCII names is hard. > > > > Unfortunately it is, due to Emacs underspecifying encoding. If we can > > manage to write an 'intern' function that accepts UTF-8 strings and > > only UTF-8 strings, I'm all for it. > > What are the problems you have in mind? After all, this is already > possible by means of 2 more function calls, as the example in the > manual shows. Are there any problems to do the same under the hood, > instead of requiring users to do that explicitly in their module code? If users want to have a truly generic "intern" function, they need to do some legwork anyway because the signature of the "intern" environment function doesn't allow embedded null bytes. It's also unclear how non-Unicode symbols should be represented (if at all). Given that almost all uses of "intern" will use ASCII symbols, it's fine to restrict the API in this way. I've provided an example for a wrapper function that allows at least interning of arbitrary Unicode strings: https://phst.eu/emacs-modules#intern. > > > > . I could understand why equality predicates are not provided in the > > > API, but I don't understand why we do provide 'eq' there. Is it > > > that much more important than the other predicates? > > > > Yes, it represents a fundamental property of objects. > > How is that relevant? Equality predicates are used very frequently > when dealing with Lisp objects; 'eq' is not different from others in > that respect. I don't recollect the reasoning, but Daniel stated that "eq" is strictly necessary, so you might want to ask him. > > > > IOW, if the API was supposed to be minimal, it looks like it isn't; > > > and if it wasn't supposed to be minimal, then some important/popular > > > functions are strangely missing, for reasons I couldn't wrap my head > > > around. > > > > It is *mostly* minimal. A *completely* minimal API would not even have > > integer and floating-point conversion functions, as those can be > > written using the string functions. But that would be far less simple > > and robust. > > "eq" and "is_not_nil" are special in that they implement access to > > fundamental object properties and can't fail, so they are fundamental > > enough to deserve an entry in the module table. > > I cannot follow this reasoning, sorry. It sounds like you are saying > that the decision what to implement and what not justifies itself > because it's there. All I can say is that as someone who wrote a > couple of lines of code in Emacs, the stuff that is in the API and the > omissions look quite arbitrary to me. Please see Daniel's original reasoning for the design. I'm not claiming perfection for the module API, but it definitely strikes a very good balance between minimalism and robustness. > > > The best source to answer the "why" questions is still the original > > design document: > > https://lists.gnu.org/archive/html/emacs-devel/2015-02/msg00960.html > > Which part(s) of that long document answer these questions, please? Mostly the first sentence "We want an ABI powerful enough to let C modules interact with Emacs, but decoupled enough to let the Emacs core evolve independently." ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2019-03-21 20:12 ` Philipp Stephani @ 2019-03-21 20:25 ` Eli Zaretskii 2019-03-21 20:34 ` Philipp Stephani 0 siblings, 1 reply; 30+ messages in thread From: Eli Zaretskii @ 2019-03-21 20:25 UTC (permalink / raw) To: Philipp Stephani; +Cc: emacs-devel > From: Philipp Stephani <p.stephani2@gmail.com> > Date: Thu, 21 Mar 2019 21:12:05 +0100 > Cc: Emacs developers <emacs-devel@gnu.org> > > > How is that relevant? Equality predicates are used very frequently > > when dealing with Lisp objects; 'eq' is not different from others in > > that respect. > > I don't recollect the reasoning, but Daniel stated that "eq" is > strictly necessary, so you might want to ask him. > [...] > > > It is *mostly* minimal. A *completely* minimal API would not even have > > > integer and floating-point conversion functions, as those can be > > > written using the string functions. But that would be far less simple > > > and robust. > > > "eq" and "is_not_nil" are special in that they implement access to > > > fundamental object properties and can't fail, so they are fundamental > > > enough to deserve an entry in the module table. > > > > I cannot follow this reasoning, sorry. It sounds like you are saying > > that the decision what to implement and what not justifies itself > > because it's there. All I can say is that as someone who wrote a > > couple of lines of code in Emacs, the stuff that is in the API and the > > omissions look quite arbitrary to me. > > Please see Daniel's original reasoning for the design. I asked the questions after reading that, so please believe me that I didn't find answers to my questions there. > Mostly the first sentence "We want an ABI powerful enough to let C > modules interact with Emacs, but decoupled enough to let the Emacs > core evolve independently." That means a judgment call, and I was questioning the judgment. Saying that someone made a call doesn't explain why the decision was what it was. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2019-03-21 20:25 ` Eli Zaretskii @ 2019-03-21 20:34 ` Philipp Stephani 2019-03-21 20:51 ` Eli Zaretskii 0 siblings, 1 reply; 30+ messages in thread From: Philipp Stephani @ 2019-03-21 20:34 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Emacs developers Am Do., 21. März 2019 um 21:25 Uhr schrieb Eli Zaretskii <eliz@gnu.org>: > > > From: Philipp Stephani <p.stephani2@gmail.com> > > Mostly the first sentence "We want an ABI powerful enough to let C > > modules interact with Emacs, but decoupled enough to let the Emacs > > core evolve independently." > > That means a judgment call, and I was questioning the judgment. > Saying that someone made a call doesn't explain why the decision was > what it was. > Well, feel free to CC Daniel and ask him directly. I agree with his judgment call, but can't know what he might have been thinking exactly. TBH I haven't spent that much time on trying to figure out the exact reasoning because potentially superfluous functions can't be removed any more, so this question seems to be of largely historical interest. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2019-03-21 20:34 ` Philipp Stephani @ 2019-03-21 20:51 ` Eli Zaretskii 2019-03-21 20:58 ` Philipp Stephani 0 siblings, 1 reply; 30+ messages in thread From: Eli Zaretskii @ 2019-03-21 20:51 UTC (permalink / raw) To: Philipp Stephani; +Cc: emacs-devel > From: Philipp Stephani <p.stephani2@gmail.com> > Date: Thu, 21 Mar 2019 21:34:39 +0100 > Cc: Emacs developers <emacs-devel@gnu.org> > > potentially superfluous functions can't be removed any more, so this > question seems to be of largely historical interest. No, it's not only of historical interest, because we can add functions. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2019-03-21 20:51 ` Eli Zaretskii @ 2019-03-21 20:58 ` Philipp Stephani 2019-03-22 1:26 ` creating unibyte strings (was: Oddities with dynamic modules) Stefan Monnier 2019-03-22 8:20 ` Oddities with dynamic modules Eli Zaretskii 0 siblings, 2 replies; 30+ messages in thread From: Philipp Stephani @ 2019-03-21 20:58 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Emacs developers Am Do., 21. März 2019 um 21:51 Uhr schrieb Eli Zaretskii <eliz@gnu.org>: > > > From: Philipp Stephani <p.stephani2@gmail.com> > > Date: Thu, 21 Mar 2019 21:34:39 +0100 > > Cc: Emacs developers <emacs-devel@gnu.org> > > > > potentially superfluous functions can't be removed any more, so this > > question seems to be of largely historical interest. > > No, it's not only of historical interest, because we can add > functions. That's true, and I agree for those we should find some clearer critera than "best judgment" or philosophical vague principles like "simplicity." Each addition should be discussed separately. Possible criteria could be: 1. Is it possible to obtain the functionality by calling existing functions? ("completeness") 2. Is it very difficult to replicate the functionality with the existing API, and the difficulty would be reduced significantly by introducing a new function? ("simplicity") 3. Is there a huge performance benefit in introducing a specialized function? If none of these are fulfilled, then the function should probably not be added ("simplicity"). For example, I'd vote for adding timespec and bignum conversion functions based on (2). ^ permalink raw reply [flat|nested] 30+ messages in thread
* creating unibyte strings (was: Oddities with dynamic modules) 2019-03-21 20:58 ` Philipp Stephani @ 2019-03-22 1:26 ` Stefan Monnier 2019-03-22 7:41 ` Eli Zaretskii 2019-03-22 8:20 ` Oddities with dynamic modules Eli Zaretskii 1 sibling, 1 reply; 30+ messages in thread From: Stefan Monnier @ 2019-03-22 1:26 UTC (permalink / raw) To: emacs-devel >> > potentially superfluous functions can't be removed any more, so this >> > question seems to be of largely historical interest. >> No, it's not only of historical interest, because we can add >> functions. Which reminds me: could someone add to the module API a primitive to build a *unibyte* string? Currently it seems the only way to do that is by building a multibyte string and then encoding it with utf-8, which is both inefficient and risky (I know it's supposed to return exactly the originally intended bytes, but it's a very round about way to do it with lots of opportunity for bugs along the way). Stefan ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: creating unibyte strings (was: Oddities with dynamic modules) 2019-03-22 1:26 ` creating unibyte strings (was: Oddities with dynamic modules) Stefan Monnier @ 2019-03-22 7:41 ` Eli Zaretskii 2019-03-22 12:33 ` creating unibyte strings Stefan Monnier 0 siblings, 1 reply; 30+ messages in thread From: Eli Zaretskii @ 2019-03-22 7:41 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel > From: Stefan Monnier <monnier@iro.umontreal.ca> > Date: Thu, 21 Mar 2019 21:26:32 -0400 > > Which reminds me: could someone add to the module API a primitive to > build a *unibyte* string? I don't like adding such a primitive. We don't want to proliferate unibyte strings in Emacs through that back door, because manipulating unibyte strings involves subtle issues many Lisp programmers are not aware of. Instead, how about doing that via vectors of byte values? If there are Emacs primitives that currently only accept strings, we could extend them. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: creating unibyte strings 2019-03-22 7:41 ` Eli Zaretskii @ 2019-03-22 12:33 ` Stefan Monnier 2019-03-22 13:27 ` Eli Zaretskii 0 siblings, 1 reply; 30+ messages in thread From: Stefan Monnier @ 2019-03-22 12:33 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel >> Which reminds me: could someone add to the module API a primitive to >> build a *unibyte* string? > I don't like adding such a primitive. We don't want to proliferate > unibyte strings in Emacs through that back door, because manipulating > unibyte strings involves subtle issues many Lisp programmers are not > aware of. I don't see what's subtle about "unibyte" strings, as long as you understand that these are strings of *bytes* instead of strings of *characters* (i.e. they're `int8[]` rather than `w_char_t[]`). "Multibyte" strings are just as subtle (maybe more so even), yet we rightly don't hesitate to offer a primitive way to construct them. > Instead, how about doing that via vectors of byte values? What's the advantage? That seems even more convoluted: create a Lisp vector of the right size (i.e. 8x the size of your string on a 64bit system), loop over your string turning each byte into a Lisp integer (with the reverted API, this involves allocation of an `emacs_value` box), then pass that to `concat`? It's probably going to be even less efficient than going through utf-8 and back. Think about cases where the module receives byte strings from the disk or the network and need to pass that to `decode-coding-string`. And consider that we might be talking about megabytes of strings. Stefan ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: creating unibyte strings 2019-03-22 12:33 ` creating unibyte strings Stefan Monnier @ 2019-03-22 13:27 ` Eli Zaretskii 2019-03-22 14:23 ` Stefan Monnier 0 siblings, 1 reply; 30+ messages in thread From: Eli Zaretskii @ 2019-03-22 13:27 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel > From: Stefan Monnier <monnier@iro.umontreal.ca> > Cc: emacs-devel@gnu.org > Date: Fri, 22 Mar 2019 08:33:02 -0400 > > >> Which reminds me: could someone add to the module API a primitive to > >> build a *unibyte* string? > > I don't like adding such a primitive. We don't want to proliferate > > unibyte strings in Emacs through that back door, because manipulating > > unibyte strings involves subtle issues many Lisp programmers are not > > aware of. > > I don't see what's subtle about "unibyte" strings, as long as you > understand that these are strings of *bytes* instead of strings > of *characters* (i.e. they're `int8[]` rather than `w_char_t[]`). That's the subtlety, right there. Handling such "strings" in Emacs Lisp can produce strange and unexpected results for someone who is not aware of the difference and its implications. > "Multibyte" strings are just as subtle (maybe more so even), yet we > rightly don't hesitate to offer a primitive way to construct them. Because we succeed to hide the subtleties in that case, so the multibyte nature is not really visible on the Lisp level, unless you try very hard to make it so. > > Instead, how about doing that via vectors of byte values? > > What's the advantage? That seems even more convoluted: create a Lisp > vector of the right size (i.e. 8x the size of your string on a 64bit > system), loop over your string turning each byte into a Lisp integer > (with the reverted API, this involves allocation of an `emacs_value` > box), then pass that to `concat`? That's one way, but I'm sure I can come up with a simpler one. ;-) > It's probably going to be even less efficient than going through utf-8 > and back. I doubt that. It's just an assignment. And it's a rare situation anyway. > Think about cases where the module receives byte strings from the disk > or the network and need to pass that to `decode-coding-string`. > And consider that we might be talking about megabytes of strings. They don't need to decode, they just need to arrange for it to be UTF-8. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: creating unibyte strings 2019-03-22 13:27 ` Eli Zaretskii @ 2019-03-22 14:23 ` Stefan Monnier 2019-03-22 15:11 ` Eli Zaretskii 0 siblings, 1 reply; 30+ messages in thread From: Stefan Monnier @ 2019-03-22 14:23 UTC (permalink / raw) To: emacs-devel >> >> Which reminds me: could someone add to the module API a primitive to >> >> build a *unibyte* string? >> > I don't like adding such a primitive. We don't want to proliferate >> > unibyte strings in Emacs through that back door, because manipulating >> > unibyte strings involves subtle issues many Lisp programmers are not >> > aware of. >> >> I don't see what's subtle about "unibyte" strings, as long as you >> understand that these are strings of *bytes* instead of strings >> of *characters* (i.e. they're `int8[]` rather than `w_char_t[]`). > > That's the subtlety, right there. Handling such "strings" in Emacs > Lisp can produce strange and unexpected results for someone who is not > aware of the difference and its implications. But this has nothing to do with the modules API: it's not more tricky then when doing it purely in Elisp. Are you seriously suggesting we deprecate unibyte strings altogether? >> "Multibyte" strings are just as subtle (maybe more so even), yet we >> rightly don't hesitate to offer a primitive way to construct them. > Because we succeed to hide the subtleties in that case, > so the multibyte nature is not really visible on the Lisp level, > unless you try very hard to make it so. Then I don't know what subtleties you're talking about. Can you give some examples of the kinds of things you're thinking of? >> > Instead, how about doing that via vectors of byte values? >> What's the advantage? That seems even more convoluted: create a Lisp >> vector of the right size (i.e. 8x the size of your string on a 64bit >> system), loop over your string turning each byte into a Lisp integer >> (with the reverted API, this involves allocation of an `emacs_value` >> box), then pass that to `concat`? > That's one way, but I'm sure I can come up with a simpler one. ;-) I'm all ears. >> It's probably going to be even less efficient than going through utf-8 >> and back. > I doubt that. It's just an assignment. And it's a rare situation > anyway. Why do you think it's rare? It's pretty common to receive non-utf-8 byte streams from the external world. And when you do receive them, it can come at a very fast pace and become temporarily anything but rare. >> Think about cases where the module receives byte strings from the disk >> or the network and need to pass that to `decode-coding-string`. >> And consider that we might be talking about megabytes of strings. > They don't need to decode, they just need to arrange for it to be > UTF-8. Three possibilities: 1- the C side string contains utf-8 text. The module API provides just the right operation, we're good to go. 2- the C side string contains text in latin-1, big5, younameit. The module API provides nothing convenient. Should we force our module to link to C-side coding-system libraries to convert to utf-8 before passing it on to the Elisp, even though Emacs already has all the needed facilities? Really? 3- The C side string contains binary data (say PNG images). What does "arrange for it to be UTF-8" even mean? -- Stefan PS: The PNG case is not hypothetical at all, it's what prompted my request. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: creating unibyte strings 2019-03-22 14:23 ` Stefan Monnier @ 2019-03-22 15:11 ` Eli Zaretskii 2019-03-22 15:37 ` Stefan Monnier 2019-03-24 14:51 ` Elias Mårtenson 0 siblings, 2 replies; 30+ messages in thread From: Eli Zaretskii @ 2019-03-22 15:11 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel > From: Stefan Monnier <monnier@iro.umontreal.ca> > Date: Fri, 22 Mar 2019 10:23:20 -0400 > > >> I don't see what's subtle about "unibyte" strings, as long as you > >> understand that these are strings of *bytes* instead of strings > >> of *characters* (i.e. they're `int8[]` rather than `w_char_t[]`). > > > > That's the subtlety, right there. Handling such "strings" in Emacs > > Lisp can produce strange and unexpected results for someone who is not > > aware of the difference and its implications. > > But this has nothing to do with the modules API: it's not more tricky > then when doing it purely in Elisp. Are you seriously suggesting we > deprecate unibyte strings altogether? We won't deprecate unibyte strings, but we decided long ago to minimize their use. > >> "Multibyte" strings are just as subtle (maybe more so even), yet we > >> rightly don't hesitate to offer a primitive way to construct them. > > Because we succeed to hide the subtleties in that case, > > so the multibyte nature is not really visible on the Lisp level, > > unless you try very hard to make it so. > > Then I don't know what subtleties you're talking about. > Can you give some examples of the kinds of things you're thinking of? String concatenation, for one. Regular expression search for another. And those just the ones I thought about in the first 5 seconds. > >> > Instead, how about doing that via vectors of byte values? > >> What's the advantage? That seems even more convoluted: create a Lisp > >> vector of the right size (i.e. 8x the size of your string on a 64bit > >> system), loop over your string turning each byte into a Lisp integer > >> (with the reverted API, this involves allocation of an `emacs_value` > >> box), then pass that to `concat`? > > That's one way, but I'm sure I can come up with a simpler one. ;-) > > I'm all ears. Provide an Emacs primitive for that, then at least some of the awkwardness is gone. And/or use records. > >> It's probably going to be even less efficient than going through utf-8 > >> and back. > > I doubt that. It's just an assignment. And it's a rare situation > > anyway. > > Why do you think it's rare? Because the number of Emacs features that require you to submit a unibyte string is very small. > It's pretty common to receive non-utf-8 byte streams from the external world. > And when you do receive them, it can come at a very fast pace and become > temporarily anything but rare. Are you talking about text encoded in some non-UTF-8 encoding? If so, it should be converted to UTF-8, and that will solve the problem. If it isn't text, then what common use cases are you talking about? > 2- the C side string contains text in latin-1, big5, younameit. > The module API provides nothing convenient. Should we force our > module to link to C-side coding-system libraries to convert to utf-8 > before passing it on to the Elisp, even though Emacs already has all > the needed facilities? Really? Yes, really. Why is that a problem? libiconv exists on every platform we support, and is easy to use. Moreover, if you just want to convert a native string into another native string, using Emacs built-in en/decoding machinery is inconvenient, because it involves more copying than necessary. > 3- The C side string contains binary data (say PNG images). > What does "arrange for it to be UTF-8" even mean? Nothing, since in this case there's no meaning to "decoding". ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: creating unibyte strings 2019-03-22 15:11 ` Eli Zaretskii @ 2019-03-22 15:37 ` Stefan Monnier 2019-03-22 15:54 ` Eli Zaretskii 2019-03-24 14:51 ` Elias Mårtenson 1 sibling, 1 reply; 30+ messages in thread From: Stefan Monnier @ 2019-03-22 15:37 UTC (permalink / raw) To: emacs-devel [ Boy this discussion is really frustrating. I should have just added the damn feature and moved on. Now I'm stuck in this morass! ] >> But this has nothing to do with the modules API: it's not more tricky >> then when doing it purely in Elisp. Are you seriously suggesting we >> deprecate unibyte strings altogether? > We won't deprecate unibyte strings, but we decided long ago to > minimize their use. Minimize their use doesn't mean that the places where they are used are less important. Sometimes what you need is a unibyte string and nothing else will do. It also doesn't explain why you want to make it extra cumbersome for modules whereas Elisp can still do it conveniently. >> Then I don't know what subtleties you're talking about. >> Can you give some examples of the kinds of things you're thinking of? > String concatenation, for one. Regular expression search for another. > And those just the ones I thought about in the first 5 seconds. I don't see in which way these are better hidden for multibyte strings than they are for unibyte strings. >> >> > Instead, how about doing that via vectors of byte values? >> >> What's the advantage? That seems even more convoluted: create a Lisp >> >> vector of the right size (i.e. 8x the size of your string on a 64bit >> >> system), loop over your string turning each byte into a Lisp integer >> >> (with the reverted API, this involves allocation of an `emacs_value` >> >> box), then pass that to `concat`? >> > That's one way, but I'm sure I can come up with a simpler one. ;-) >> I'm all ears. > Provide an Emacs primitive for that, then at least some of the > awkwardness is gone. No matter the primitive you provide, it means that to build a unibyte Elisp strings out of a C char[], you're suggesting we go through an extra copy that uses up 8x the memory. With such inefficient interfaces, the whole idea of writing modules becomes completely unattractive: better write a separate application and communicate via pipes (then you can get unibyte strings in the natural way). > And/or use records. I don't understand what you mean by "use records". >> >> It's probably going to be even less efficient than going through utf-8 >> >> and back. >> > I doubt that. It's just an assignment. And it's a rare situation >> > anyway. >> Why do you think it's rare? > Because the number of Emacs features that require you to submit a > unibyte string is very small. Maybe rare in terms of number of lines of code that will want to do. But that doesn't mean rare in terms of number of times it'll be executed for a specific user, so performance considerations should apply. >> 2- the C side string contains text in latin-1, big5, younameit. >> The module API provides nothing convenient. Should we force our >> module to link to C-side coding-system libraries to convert to utf-8 >> before passing it on to the Elisp, even though Emacs already has all >> the needed facilities? Really? > > Yes, really. Why is that a problem? libiconv exists on every > platform we support, and is easy to use. Moreover, if you just want > to convert a native string into another native string, using Emacs > built-in en/decoding machinery is inconvenient, because it involves > more copying than necessary. The idea is not to use Emacs as a C library for text conversion, but that if you receive a latin-1 string and want to pass it to Emacs, it makes a lot of sense to do: make_bytestring (s) and later (decode-coding-string s) then having to link with libiconv. >> 3- The C side string contains binary data (say PNG images). >> What does "arrange for it to be UTF-8" even mean? > Nothing, since in this case there's no meaning to "decoding". My point exactly: what should be done instead? The solution currently used for this existing case is to call make_string on it (even though it's not a utf-8 string) and then pass it through (encode-coding-string s 'utf-8) which is ridiculously inefficient compared to what make_bytestring would do. Stefan ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: creating unibyte strings 2019-03-22 15:37 ` Stefan Monnier @ 2019-03-22 15:54 ` Eli Zaretskii 0 siblings, 0 replies; 30+ messages in thread From: Eli Zaretskii @ 2019-03-22 15:54 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel > From: Stefan Monnier <monnier@iro.umontreal.ca> > Date: Fri, 22 Mar 2019 11:37:59 -0400 > > [ Boy this discussion is really frustrating. I should have just added > the damn feature and moved on. Now I'm stuck in this morass! ] That's it, I'm outta here. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: creating unibyte strings 2019-03-22 15:11 ` Eli Zaretskii 2019-03-22 15:37 ` Stefan Monnier @ 2019-03-24 14:51 ` Elias Mårtenson 2019-03-24 17:10 ` Eli Zaretskii 1 sibling, 1 reply; 30+ messages in thread From: Elias Mårtenson @ 2019-03-24 14:51 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 705 bytes --] On Fri, 22 Mar 2019 at 23:14, Eli Zaretskii <eliz@gnu.org> wrote: > Because the number of Emacs features that require you to submit a > unibyte string is very small. In the one native module that I have written, integration of GSSAPI, I end up passing large byte buffers back and forth between Elisp and C. There really is no efficient way to do this, so I ended up having to use vectors and use extract_integer in a loop. Am I misunderstanding this discussion, and there is a better way to pass binary buffers to modules that I don't know about? This is what the current code looks like, and it's not really pretty: https://github.com/lokedhs/emacs-gssapi/blob/master/gssapi.c#L382 Regards, Elias [-- Attachment #2: Type: text/html, Size: 1183 bytes --] ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: creating unibyte strings 2019-03-24 14:51 ` Elias Mårtenson @ 2019-03-24 17:10 ` Eli Zaretskii 2019-03-25 1:47 ` Elias Mårtenson 0 siblings, 1 reply; 30+ messages in thread From: Eli Zaretskii @ 2019-03-24 17:10 UTC (permalink / raw) To: Elias Mårtenson; +Cc: monnier, emacs-devel > From: Elias Mårtenson <lokedhs@gmail.com> > Date: Sun, 24 Mar 2019 22:51:16 +0800 > Cc: Stefan Monnier <monnier@iro.umontreal.ca>, emacs-devel <emacs-devel@gnu.org> > > In the one native module that I have written, integration of GSSAPI, I end up passing large byte buffers back > and forth between Elisp and C. There really is no efficient way to do this, so I ended up having to use vectors > and use extract_integer in a loop. Can you tell why the byte buffer needs to be exposed to Lisp in this case? IOW, what would a Lisp program using this module want to do with these byte buffers? ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: creating unibyte strings 2019-03-24 17:10 ` Eli Zaretskii @ 2019-03-25 1:47 ` Elias Mårtenson 2019-03-25 3:41 ` Eli Zaretskii 0 siblings, 1 reply; 30+ messages in thread From: Elias Mårtenson @ 2019-03-25 1:47 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 935 bytes --] On Mon, 25 Mar 2019, 01:10 Eli Zaretskii, <eliz@gnu.org> wrote: > > Can you tell why the byte buffer needs to be exposed to Lisp in this > case? IOW, what would a Lisp program using this module want to do > with these byte buffers? > In this particular case, I'm exposing GSSAPI, which is a rather low level interface to Kerberos (well, it supports multiple systems, but it's mostly used for Kerberos). For example, one function is called gss-unwrap, and it takes an encrypted byte array and decrypts it, returning a new byte array with the decrypted content. What the impact is depends on the Elisp code that uses GSS. In the case of IMAP for example, it's not too bad, since only the initial handshake is passed through these functions (IMAP encryption is handled by TLS, not Kerberos). However, there are other uses where every single package is passed through the wrap and unwrap functions. Regards, Elias Regards, Elias > [-- Attachment #2: Type: text/html, Size: 1702 bytes --] ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: creating unibyte strings 2019-03-25 1:47 ` Elias Mårtenson @ 2019-03-25 3:41 ` Eli Zaretskii 2019-03-26 10:23 ` Elias Mårtenson 0 siblings, 1 reply; 30+ messages in thread From: Eli Zaretskii @ 2019-03-25 3:41 UTC (permalink / raw) To: Elias Mårtenson; +Cc: monnier, emacs-devel > From: Elias Mårtenson <lokedhs@gmail.com> > Date: Mon, 25 Mar 2019 09:47:26 +0800 > Cc: Stefan Monnier <monnier@iro.umontreal.ca>, emacs-devel <emacs-devel@gnu.org> > > Can you tell why the byte buffer needs to be exposed to Lisp in this > case? IOW, what would a Lisp program using this module want to do > with these byte buffers? > > In this particular case, I'm exposing GSSAPI, which is a rather low level interface to Kerberos (well, it supports > multiple systems, but it's mostly used for Kerberos). > > For example, one function is called gss-unwrap, and it takes an encrypted byte array and decrypts it, returning > a new byte array with the decrypted content. > > What the impact is depends on the Elisp code that uses GSS. In the case of IMAP for example, it's not too > bad, since only the initial handshake is passed through these functions (IMAP encryption is handled by TLS, > not Kerberos). However, there are other uses where every single package is passed through the wrap and > unwrap functions. I guess I was asking why is this done in Lisp, not in C. The decrypted stuff is human-readable text, is it not? Then why would a Lisp program want to see the encrypted byte array? ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: creating unibyte strings 2019-03-25 3:41 ` Eli Zaretskii @ 2019-03-26 10:23 ` Elias Mårtenson 2019-03-26 11:12 ` Stefan Monnier 0 siblings, 1 reply; 30+ messages in thread From: Elias Mårtenson @ 2019-03-26 10:23 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 515 bytes --] On Mon, 25 Mar 2019 at 11:41, Eli Zaretskii <eliz@gnu.org> wrote: > I guess I was asking why is this done in Lisp, not in C. The > decrypted stuff is human-readable text, is it not? Then why would a > Lisp program want to see the encrypted byte array? > No, it's not. This is called from the backend protocol implementation of IMAP, for example. When Gnus wants to load a mailbox, it calls the IMAP code (Elisp) which then calls into GSSAPI to perform the decryption of the underlying packets. Regards, Elias [-- Attachment #2: Type: text/html, Size: 853 bytes --] ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: creating unibyte strings 2019-03-26 10:23 ` Elias Mårtenson @ 2019-03-26 11:12 ` Stefan Monnier 0 siblings, 0 replies; 30+ messages in thread From: Stefan Monnier @ 2019-03-26 11:12 UTC (permalink / raw) To: Elias Mårtenson; +Cc: Eli Zaretskii, emacs-devel >> I guess I was asking why is this done in Lisp, not in C. The >> decrypted stuff is human-readable text, is it not? Then why would a >> Lisp program want to see the encrypted byte array? > No, it's not. This is called from the backend protocol implementation of > IMAP, for example. When Gnus wants to load a mailbox, it calls the IMAP > code (Elisp) which then calls into GSSAPI to perform the decryption of the > underlying packets. IIUC the reason why Lisp code sees the byte array is because the module cannot hook itself directly into the underlying network connection, so the imap connection returns the byte-array to your code which then passes it on to the GSSAPI module, which then returns another byte-array which might be sent back to the imap server, ... Stefan ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: Oddities with dynamic modules 2019-03-21 20:58 ` Philipp Stephani 2019-03-22 1:26 ` creating unibyte strings (was: Oddities with dynamic modules) Stefan Monnier @ 2019-03-22 8:20 ` Eli Zaretskii 1 sibling, 0 replies; 30+ messages in thread From: Eli Zaretskii @ 2019-03-22 8:20 UTC (permalink / raw) To: Philipp Stephani; +Cc: emacs-devel > From: Philipp Stephani <p.stephani2@gmail.com> > Date: Thu, 21 Mar 2019 21:58:11 +0100 > Cc: Emacs developers <emacs-devel@gnu.org> > > > No, it's not only of historical interest, because we can add > > functions. > > That's true, and I agree for those we should find some clearer critera > than "best judgment" or philosophical vague principles like > "simplicity." > [...] > For example, I'd vote for adding timespec and bignum conversion > functions based on (2). I agree with the last proposal. But I also think that we need a lot more convenience wrappers even for existing functionalities. Any non-trivial module whose code I ever saw is a clear evidence to that, as they all introduce their own wrappers for practically the same purposes. ^ permalink raw reply [flat|nested] 30+ messages in thread
end of thread, other threads:[~2019-03-26 11:12 UTC | newest] Thread overview: 30+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-10-11 18:12 Oddities with dynamic modules Eli Zaretskii 2018-10-12 14:29 ` Kaushal Modi 2019-02-10 20:23 ` Philipp Stephani 2019-02-11 15:45 ` Eli Zaretskii 2019-02-11 16:04 ` Yuri Khan 2019-03-21 20:04 ` Philipp Stephani 2019-03-21 20:17 ` Eli Zaretskii 2019-03-21 20:32 ` Philipp Stephani 2019-03-21 20:46 ` Eli Zaretskii 2019-03-21 20:51 ` Philipp Stephani 2019-03-21 20:12 ` Philipp Stephani 2019-03-21 20:25 ` Eli Zaretskii 2019-03-21 20:34 ` Philipp Stephani 2019-03-21 20:51 ` Eli Zaretskii 2019-03-21 20:58 ` Philipp Stephani 2019-03-22 1:26 ` creating unibyte strings (was: Oddities with dynamic modules) Stefan Monnier 2019-03-22 7:41 ` Eli Zaretskii 2019-03-22 12:33 ` creating unibyte strings Stefan Monnier 2019-03-22 13:27 ` Eli Zaretskii 2019-03-22 14:23 ` Stefan Monnier 2019-03-22 15:11 ` Eli Zaretskii 2019-03-22 15:37 ` Stefan Monnier 2019-03-22 15:54 ` Eli Zaretskii 2019-03-24 14:51 ` Elias Mårtenson 2019-03-24 17:10 ` Eli Zaretskii 2019-03-25 1:47 ` Elias Mårtenson 2019-03-25 3:41 ` Eli Zaretskii 2019-03-26 10:23 ` Elias Mårtenson 2019-03-26 11:12 ` Stefan Monnier 2019-03-22 8:20 ` Oddities with dynamic modules Eli Zaretskii
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).