Rocksolid Light

Welcome to RetroBBS

mail  files  register  newsreader  groups  login

Message-ID:  

It's not really a rule--it's more like a trend. -- Larry Wall in <199710221721.KAA24321@wall.org>


devel / comp.lang.lisp / Re: how to write these two procedures?

SubjectAuthor
* how to write these two procedures?Julieta Shem
+* Re: how to write these two procedures?Kaz Kylheku
|`- Re: how to write these two procedures?Julieta Shem
+* Re: how to write these two procedures?Lawrence D'Oliveiro
|`- Re: how to write these two procedures?Lawrence D'Oliveiro
`* Re: how to write these two procedures?Alan Bawden
 `* Re: how to write these two procedures?Julieta Shem
  `* Re: how to write these two procedures?Alan Bawden
   `- Re: how to write these two procedures?Julieta Shem

1
how to write these two procedures?

<87zfx8ua1a.fsf@yaxenu.org>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17800&group=comp.lang.lisp#17800

  copy link   Newsgroups: comp.lang.lisp
Path: i2pn2.org!i2pn.org!nntp.comgw.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: jshem@yaxenu.org (Julieta Shem)
Newsgroups: comp.lang.lisp
Subject: how to write these two procedures?
Date: Sat, 13 Jan 2024 19:46:09 -0300
Organization: A noiseless patient Spider
Lines: 51
Message-ID: <87zfx8ua1a.fsf@yaxenu.org>
MIME-Version: 1.0
Content-Type: text/plain
Injection-Info: dont-email.me; posting-host="c2f0907cbb8bbadcd021849970a21db1";
logging-data="142415"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+r7gz1FH3dyu6tpYTpITUGqB3jhbhdVCE="
Cancel-Lock: sha1:PCqRYeg8toJAKFIBvOJVu0K71ko=
sha1:uEZkpB/T5ifP8JIcV4/lkcXaUE0=
 by: Julieta Shem - Sat, 13 Jan 2024 22:46 UTC

I've got two procedures that are nearly identical. They're only
different in the :data-argument in make-response. (I've simplified them
a bit to make them short and easy to read, but they're very close to the
originals.)

--8<---------------cut here---------------start------------->8---
(defun head-response (r g i)
(let ((a (handler-case (fetch-article g i)
(sb-ext:file-does-not-exist (c)
(error-response c)))))
(cond ((typep a 'response) a)
(t (prepend-response-with
(format nil "~a ~a" i (extract-mid a))
(make-response :multi-line 'yes :code 200
:request r :data (article-headers (parse-article a))))))))

(defun body-response (r g i)
(let ((a (handler-case (fetch-article g i)
(sb-ext:file-does-not-exist (c)
(error-response c)))))
(cond ((typep a 'response) a)
(t (prepend-response-with
(format nil "~a ~a" i (extract-mid a))
(make-response :multi-line 'yes :code 200
:request r :data (article-body (parse-article a))))))))
--8<---------------cut here---------------end--------------->8---

Their differences are

head-response: (article-headers (parse-article a))
body-response: (article-body (parse-article a))

I wouldn't think I can express these as a /thunk/ because they depend on
the variable /a/ that is defined in a certain context in each procedure.

Is this the case for a macro? What do you advise? Thank you!

Keep in mind that I might write other procedures. For instance, here's
another one that's already written:

--8<---------------cut here---------------start------------->8---
(defun article-response (r g i)
(let ((a (handler-case (fetch-article g i)
(sb-ext:file-does-not-exist (c)
(error-response c)))))
(cond ((typep a 'response) a)
(t (prepend-response-with
(format nil "~a ~a" i (extract-mid a))
(make-response :multi-line 'yes :code 200
:request r :data (encode-body a)))))))
--8<---------------cut here---------------end--------------->8---

Re: how to write these two procedures?

<20240113145306.947@kylheku.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17801&group=comp.lang.lisp#17801

  copy link   Newsgroups: comp.lang.lisp
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: 433-929-6894@kylheku.com (Kaz Kylheku)
Newsgroups: comp.lang.lisp
Subject: Re: how to write these two procedures?
Date: Sat, 13 Jan 2024 23:04:36 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 82
Message-ID: <20240113145306.947@kylheku.com>
References: <87zfx8ua1a.fsf@yaxenu.org>
Injection-Date: Sat, 13 Jan 2024 23:04:36 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="e69fae11c5705df28b6d9021f4d2730c";
logging-data="148674"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX186e7gbpeLHuucPZw/5zuYnw3rNKd2n8xQ="
User-Agent: slrn/pre1.0.4-9 (Linux)
Cancel-Lock: sha1:+A8NDNJhwreabYJ+dcnvoDOl4xo=
 by: Kaz Kylheku - Sat, 13 Jan 2024 23:04 UTC

On 2024-01-13, Julieta Shem <jshem@yaxenu.org> wrote:
> I've got two procedures that are nearly identical. They're only
> different in the :data-argument in make-response. (I've simplified them
> a bit to make them short and easy to read, but they're very close to the
> originals.)
>
> --8<---------------cut here---------------start------------->8---
> (defun head-response (r g i)
> (let ((a (handler-case (fetch-article g i)
> (sb-ext:file-does-not-exist (c)
> (error-response c)))))
> (cond ((typep a 'response) a)
> (t (prepend-response-with
> (format nil "~a ~a" i (extract-mid a))
> (make-response :multi-line 'yes :code 200
> :request r :data (article-headers (parse-article a))))))))
>
> (defun body-response (r g i)
> (let ((a (handler-case (fetch-article g i)
> (sb-ext:file-does-not-exist (c)
> (error-response c)))))
> (cond ((typep a 'response) a)
> (t (prepend-response-with
> (format nil "~a ~a" i (extract-mid a))
> (make-response :multi-line 'yes :code 200
> :request r :data (article-body (parse-article a))))))))
> --8<---------------cut here---------------end--------------->8---

Here is one (untested) possibility:

(defmacro prepare-article-response (r g i avar expr)
`(let ((,avar (handler-case (fetch-article ,g ,i)
(sb-ext:file-does-not-exist (c)
(error-response c)))))
(cond ((typep ,avar 'response) ,avar)
(t (prepend-response-with
(format nil "~a ~a" ,i (extract-mid ,avar))
(make-response :multi-line 'yes :code 200
:request ,r :data ,expr))))))

(defun head-response (r g i)
(prepare-article-response r g i a (article-headers (parse-article a))))

(defun body-response (r g i)
(prepare-article-response r g i a (article-body (parse-article a))))

The redundant calls to parse-article seem wasteful, but that's an
organizational issue beyond the present scope.

Caveats: the i argument is evaluated twice, and r g i are not
evaluated in the order they appear in the macro argument list.

If this is only as a jig for writing functions like the above, where
those expressions are symbols referring to arguments, that's not a
problem.

We can write the macro by passing a lambda into a function:

(defun prepare-article-response-impl (r g i fun)
(let ((a (handler-case (fetch-article g i)
(sb-ext:file-does-not-exist (c)
(error-response c)))))
(cond ((typep a 'response) a)
(t (prepend-response-with
(format nil "~a ~a" i (extract-mid a))
(make-response :multi-line 'yes :code 200
:request r :data (funcall fun a)))))))

(defmacro prepare-article-response (r g i avar expr)
^(prepare-article-response-impl ,r ,g ,i (lambda (,avar) ,expr)))

defuns are as before. The order of evaluation issues disappear,
sine we are no inseting the argument expressions r g i into
a function argument list.

--
TXR Programming Language: http://nongnu.org/txr
Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
Mastodon: @Kazinator@mstdn.ca
NOTE: If you use Google Groups, I don't see you, unless you're whitelisted.

Re: how to write these two procedures?

<unv54l$4bge$2@dont-email.me>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17802&group=comp.lang.lisp#17802

  copy link   Newsgroups: comp.lang.lisp
Path: i2pn2.org!i2pn.org!news.swapon.de!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: ldo@nz.invalid (Lawrence D'Oliveiro)
Newsgroups: comp.lang.lisp
Subject: Re: how to write these two procedures?
Date: Sat, 13 Jan 2024 23:08:05 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 44
Message-ID: <unv54l$4bge$2@dont-email.me>
References: <87zfx8ua1a.fsf@yaxenu.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Injection-Date: Sat, 13 Jan 2024 23:08:05 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="5cf5a003a05059306218191ac330ad5f";
logging-data="142862"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+9Z67igwWmOISqzoHNqxJ8"
User-Agent: Pan/0.155 (Kherson; fc5a80b8)
Cancel-Lock: sha1:9/8AAVhnzWQbDq/qVkD8yUCQBd4=
 by: Lawrence D'Oliv - Sat, 13 Jan 2024 23:08 UTC

On Sat, 13 Jan 2024 19:46:09 -0300, Julieta Shem wrote:

> Their differences are
>
> head-response: (article-headers (parse-article a))
> body-response: (article-body (parse-article a))

How about this (sorry, more of a Python programmer than a Lisp programmer,
but hopefully you get the idea):

(defun make-response (article-part)
(lambda (r g i)
(let
(
(a
(handler-case
(fetch-article g i)
(sb-ext:file-does-not-exist (c)
(error-response c))
)
)
)
(cond
((typep a 'response)
a
)
(t
(prepend-response-with
(format nil "~a ~a" i (extract-mid a))
(make-response
:multi-line 'yes
:code 200
:request r
:data (article-part (parse-article a))
)
)
)
) ; cond
) ; let
) ; lambda
) ; make-response

(fset head-response (make-response (symbol-function article-headers)))
(fset body-response (make-response (symbol-function article-part)))

Re: how to write these two procedures?

<86zfx8su5r.fsf@williamsburg.bawden.org>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17803&group=comp.lang.lisp#17803

  copy link   Newsgroups: comp.lang.lisp
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!bawden.eternal-september.org!.POSTED!not-for-mail
From: alan@csail.mit.edu (Alan Bawden)
Newsgroups: comp.lang.lisp
Subject: Re: how to write these two procedures?
Date: Sat, 13 Jan 2024 18:14:24 -0500
Organization: ITS Preservation Society
Lines: 20
Message-ID: <86zfx8su5r.fsf@williamsburg.bawden.org>
References: <87zfx8ua1a.fsf@yaxenu.org>
MIME-Version: 1.0
Content-Type: text/plain
Injection-Info: bawden.eternal-september.org; posting-host="ad613cd73843a1b8823d39b70c75d2ff";
logging-data="149289"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/UEuU0FyEIcZ5ib4q16y8Q"
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4 (gnu/linux)
Cancel-Lock: sha1:6aoLlGgLjxYpvg0RJACLczp8hNk=
sha1:KgxfhNU6uN1hBnOGWb0+c6eDODE=
 by: Alan Bawden - Sat, 13 Jan 2024 23:14 UTC

Julieta Shem <jshem@yaxenu.org> writes:

I've got two procedures that are nearly identical. They're only
different in the :data-argument in make-response.
...
Is this the case for a macro? What do you advise? Thank you!

A macro? Why? What's wrong with:

(defun foobar (r g i get-data)
(let ((a (handler-case (fetch-article g i)
(sb-ext:file-does-not-exist (c)
(error-response c)))))
(cond ((typep a 'response) a)
(t (prepend-response-with
(format nil "~a ~a" i (extract-mid a))
(make-response :multi-line 'yes :code 200
:request r :data (funcall get-data (parse-article a))))))))

- Alan

Re: how to write these two procedures?

<87sf30u7xs.fsf@yaxenu.org>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17804&group=comp.lang.lisp#17804

  copy link   Newsgroups: comp.lang.lisp
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: jshem@yaxenu.org (Julieta Shem)
Newsgroups: comp.lang.lisp
Subject: Re: how to write these two procedures?
Date: Sat, 13 Jan 2024 20:31:27 -0300
Organization: A noiseless patient Spider
Lines: 75
Message-ID: <87sf30u7xs.fsf@yaxenu.org>
References: <87zfx8ua1a.fsf@yaxenu.org> <20240113145306.947@kylheku.com>
MIME-Version: 1.0
Content-Type: text/plain
Injection-Info: dont-email.me; posting-host="1051c3ee09d0f7051ecbe710b9d85901";
logging-data="154478"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18dz7KhZGbRomHsyV9tyzcE0KVgUVER4SY="
Cancel-Lock: sha1:k88jOI/a4w3NPWgtOCW+KPmxEE4=
sha1:gAClBsnfbLkuhGDSiS01HBrvkqU=
 by: Julieta Shem - Sat, 13 Jan 2024 23:31 UTC

Kaz Kylheku <433-929-6894@kylheku.com> writes:

> On 2024-01-13, Julieta Shem <jshem@yaxenu.org> wrote:
>> I've got two procedures that are nearly identical. They're only
>> different in the :data-argument in make-response. (I've simplified them
>> a bit to make them short and easy to read, but they're very close to the
>> originals.)
>>
>> --8<---------------cut here---------------start------------->8---
>> (defun head-response (r g i)
>> (let ((a (handler-case (fetch-article g i)
>> (sb-ext:file-does-not-exist (c)
>> (error-response c)))))
>> (cond ((typep a 'response) a)
>> (t (prepend-response-with
>> (format nil "~a ~a" i (extract-mid a))
>> (make-response :multi-line 'yes :code 200
>> :request r :data (article-headers (parse-article a))))))))
>>
>> (defun body-response (r g i)
>> (let ((a (handler-case (fetch-article g i)
>> (sb-ext:file-does-not-exist (c)
>> (error-response c)))))
>> (cond ((typep a 'response) a)
>> (t (prepend-response-with
>> (format nil "~a ~a" i (extract-mid a))
>> (make-response :multi-line 'yes :code 200
>> :request r :data (article-body (parse-article a))))))))
>> --8<---------------cut here---------------end--------------->8---
>
> Here is one (untested) possibility:
>
> (defmacro prepare-article-response (r g i avar expr)
> `(let ((,avar (handler-case (fetch-article ,g ,i)
> (sb-ext:file-does-not-exist (c)
> (error-response c)))))
> (cond ((typep ,avar 'response) ,avar)
> (t (prepend-response-with
> (format nil "~a ~a" ,i (extract-mid ,avar))
> (make-response :multi-line 'yes :code 200
> :request ,r :data ,expr))))))

Nice. I hadn't thought of the /avar/ idea.

> (defun head-response (r g i)
> (prepare-article-response r g i a (article-headers (parse-article a))))
>
> (defun body-response (r g i)
> (prepare-article-response r g i a (article-body (parse-article a))))
>
>
> The redundant calls to parse-article seem wasteful, but that's an
> organizational issue beyond the present scope.

That's interesting. How would you avoid that redundancy? Any small
example would be nice.

> We can write the macro by passing a lambda into a function:
>
> (defun prepare-article-response-impl (r g i fun)
> (let ((a (handler-case (fetch-article g i)
> (sb-ext:file-does-not-exist (c)
> (error-response c)))))
> (cond ((typep a 'response) a)
> (t (prepend-response-with
> (format nil "~a ~a" i (extract-mid a))
> (make-response :multi-line 'yes :code 200
> :request r :data (funcall fun a)))))))
>
> (defmacro prepare-article-response (r g i avar expr)
> ^(prepare-article-response-impl ,r ,g ,i (lambda (,avar) ,expr)))

That's pretty nice as well --- clears up a bunch of lambda expressions.

Thank you!

Re: how to write these two procedures?

<87le8su7w2.fsf@yaxenu.org>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17805&group=comp.lang.lisp#17805

  copy link   Newsgroups: comp.lang.lisp
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: jshem@yaxenu.org (Julieta Shem)
Newsgroups: comp.lang.lisp
Subject: Re: how to write these two procedures?
Date: Sat, 13 Jan 2024 20:32:29 -0300
Organization: A noiseless patient Spider
Lines: 24
Message-ID: <87le8su7w2.fsf@yaxenu.org>
References: <87zfx8ua1a.fsf@yaxenu.org>
<86zfx8su5r.fsf@williamsburg.bawden.org>
MIME-Version: 1.0
Content-Type: text/plain
Injection-Info: dont-email.me; posting-host="1051c3ee09d0f7051ecbe710b9d85901";
logging-data="154478"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX196H2xzoAaFAt4fdzRtXf9XJdTHwzvE6w4="
Cancel-Lock: sha1:X42ZXV+fcq39LjhbEMAgMuZD6KI=
sha1:6OKKE5IMtA+cI9h98WmdYyoz/iA=
 by: Julieta Shem - Sat, 13 Jan 2024 23:32 UTC

Alan Bawden <alan@csail.mit.edu> writes:

> Julieta Shem <jshem@yaxenu.org> writes:
>
> I've got two procedures that are nearly identical. They're only
> different in the :data-argument in make-response.
> ...
> Is this the case for a macro? What do you advise? Thank you!
>
> A macro? Why? What's wrong with:
>
> (defun foobar (r g i get-data)
> (let ((a (handler-case (fetch-article g i)
> (sb-ext:file-does-not-exist (c)
> (error-response c)))))
> (cond ((typep a 'response) a)
> (t (prepend-response-with
> (format nil "~a ~a" i (extract-mid a))
> (make-response :multi-line 'yes :code 200
> :request r :data (funcall get-data (parse-article a))))))))

That's pretty simple. Thanks. That's what I'm going to do here. I'll
leave the macro for when it's really needed --- learning to distinguish
when they're needed and when they're not.

Re: how to write these two procedures?

<86v87wssjj.fsf@williamsburg.bawden.org>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17806&group=comp.lang.lisp#17806

  copy link   Newsgroups: comp.lang.lisp
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!bawden.eternal-september.org!.POSTED!not-for-mail
From: alan@csail.mit.edu (Alan Bawden)
Newsgroups: comp.lang.lisp
Subject: Re: how to write these two procedures?
Date: Sat, 13 Jan 2024 18:49:20 -0500
Organization: ITS Preservation Society
Lines: 14
Message-ID: <86v87wssjj.fsf@williamsburg.bawden.org>
References: <87zfx8ua1a.fsf@yaxenu.org>
<86zfx8su5r.fsf@williamsburg.bawden.org> <87le8su7w2.fsf@yaxenu.org>
MIME-Version: 1.0
Content-Type: text/plain
Injection-Info: bawden.eternal-september.org; posting-host="ad613cd73843a1b8823d39b70c75d2ff";
logging-data="155629"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+IHd67QnmQYOhFofCxJVal"
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4 (gnu/linux)
Cancel-Lock: sha1:O03th0QoIK1yauJ5y6ga1vbWahA=
sha1:RYwPy/xNT1hz878PxhvCoPXZ1kE=
 by: Alan Bawden - Sat, 13 Jan 2024 23:49 UTC

Julieta Shem <jshem@yaxenu.org> writes:

That's pretty simple. Thanks. That's what I'm going to do here. I'll
leave the macro for when it's really needed --- learning to distinguish
when they're needed and when they're not.

The #2 trap that novice Lisp programmers fall into is using macros when
they don't need to. A novice that thinks they need to define a macro is
probably wrong.

The #1 trap is calling EVAL. A novice that thinks they need to call
EVAL is always wrong.

- Alan

Re: how to write these two procedures?

<87cyu4u6he.fsf@yaxenu.org>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17807&group=comp.lang.lisp#17807

  copy link   Newsgroups: comp.lang.lisp
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: jshem@yaxenu.org (Julieta Shem)
Newsgroups: comp.lang.lisp
Subject: Re: how to write these two procedures?
Date: Sat, 13 Jan 2024 21:02:53 -0300
Organization: A noiseless patient Spider
Lines: 18
Message-ID: <87cyu4u6he.fsf@yaxenu.org>
References: <87zfx8ua1a.fsf@yaxenu.org>
<86zfx8su5r.fsf@williamsburg.bawden.org> <87le8su7w2.fsf@yaxenu.org>
<86v87wssjj.fsf@williamsburg.bawden.org>
MIME-Version: 1.0
Content-Type: text/plain
Injection-Info: dont-email.me; posting-host="1051c3ee09d0f7051ecbe710b9d85901";
logging-data="162473"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19aIMm4eHR36EtD8lyHHT+F0LJk3ey+UZg="
Cancel-Lock: sha1:2BerVpaSC2F8N2AKTyYJ1GSy1hE=
sha1:I/ikgPZDKUYx1qZt1UUevkDD8IQ=
 by: Julieta Shem - Sun, 14 Jan 2024 00:02 UTC

Alan Bawden <alan@csail.mit.edu> writes:

> Julieta Shem <jshem@yaxenu.org> writes:
>
> That's pretty simple. Thanks. That's what I'm going to do here. I'll
> leave the macro for when it's really needed --- learning to distinguish
> when they're needed and when they're not.
>
> The #2 trap that novice Lisp programmers fall into is using macros when
> they don't need to. A novice that thinks they need to define a macro is
> probably wrong.
>
> The #1 trap is calling EVAL. A novice that thinks they need to call
> EVAL is always wrong.

Thanks for the advice. I haven't called eval yet, thankfully. :-) But I
think I can easily fall for #2. I'll post here all my macros to see
what you guys think.

Re: how to write these two procedures?

<unv91l$51dg$1@dont-email.me>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=17808&group=comp.lang.lisp#17808

  copy link   Newsgroups: comp.lang.lisp
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: ldo@nz.invalid (Lawrence D'Oliveiro)
Newsgroups: comp.lang.lisp
Subject: Re: how to write these two procedures?
Date: Sun, 14 Jan 2024 00:14:45 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 6
Message-ID: <unv91l$51dg$1@dont-email.me>
References: <87zfx8ua1a.fsf@yaxenu.org> <unv54l$4bge$2@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Injection-Date: Sun, 14 Jan 2024 00:14:45 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="5cf5a003a05059306218191ac330ad5f";
logging-data="165296"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18Y3NO2+DetiEcQ3QfAJ3Oi"
User-Agent: Pan/0.155 (Kherson; fc5a80b8)
Cancel-Lock: sha1:UOFxbU+ojNWQp4KfYosj8uy4Dn8=
 by: Lawrence D'Oliv - Sun, 14 Jan 2024 00:14 UTC

On Sat, 13 Jan 2024 23:08:05 -0000 (UTC), I wrote:

> :data (article-part (parse-article a))

That “(article-part ...” should be “(funcall article-part ...”, since the
function is being passed as the value of a variable.

1
server_pubkey.txt

rocksolid light 0.9.8
clearnet tor