Portable S-expressions Lassi Kortela (16 Apr 2021 09:40 UTC)
Re: Portable S-expressions John Cowan (20 Apr 2021 12:09 UTC)
Re: Portable S-expressions elf (20 Apr 2021 12:14 UTC)
Re: Portable S-expressions Lassi Kortela (20 Apr 2021 12:49 UTC)
Re: Portable S-expressions elf (20 Apr 2021 12:59 UTC)
Re: Portable S-expressions Lassi Kortela (20 Apr 2021 13:09 UTC)
Re: Portable S-expressions John Cowan (20 Apr 2021 19:29 UTC)
Re: Portable S-expressions Lassi Kortela (20 Apr 2021 20:55 UTC)
Re: Portable S-expressions Peter Bex (20 Apr 2021 12:22 UTC)
Re: Portable S-expressions Lassi Kortela (20 Apr 2021 13:03 UTC)
Re: Portable S-expressions Peter Bex (20 Apr 2021 13:15 UTC)
Re: Portable S-expressions Lassi Kortela (20 Apr 2021 13:27 UTC)
Re: Portable S-expressions Lassi Kortela (20 Apr 2021 13:33 UTC)

Re: Portable S-expressions Lassi Kortela 20 Apr 2021 12:48 UTC

Thank you for the comments!

[Hencefort, POSE is the working name for this notation :)]

John wrote:
> In order to evaluate this idea, we need a list of Lisps that the syntax
> is to be portable to.  For example:
>
> 1) Vertical bars are not portable to R6RS systems

Yes, they are not that portable. Not even Emacs Lisp has them. Common
Lisp, R7RS, and Racket do.

> 2) #(...) vector syntax is portable to all Lisps I know of except Elisp
> (square brackets) and Interlisp (no syntax).

I would leave out vectors from a portable syntax since lists can
represent all data that vectors can. Interop with languages like Python,
Ruby and JavaScript is important, and those have only one
list/vector/array type.

It would also be nice to leave open the possibility of future Lisp
and/or Scheme dialects where dotted pairs don't exist and lists are
actually vectors (heresy, yes, but AFAICT most of the good stuff from
Scheme would work fine without a pair datatype).

> 3) R5RS requires support only for \\ and \" in strings.
Yes, R5RS string escapes are delightfully minimalist; Common Lisp is the
same. Thankfully both standardized on backslash as the escape character.

For the string and symbol syntax, we could be ultra-minimalist, drop
vertical-bar symbols, and drop string escapes other than \\ and \". But
then we can't represent a significant amount of real text. It would be
nice if a procedure that writes POSE can be confident that any (Unicode)
string or symbol it is told to write can in fact be encoded somehow. It
can already be confident that it can encode any (proper) list; would be
nice to have the same guarantee for the other supported data types.

elf wrote:
> Don't forget that #t/'() for certain lisps, if we're talking
> boolean-equivalents.

Indeed, booleans are difficult to do in a syntax spanning all Lisp
dialects since there is broad disagreement. Scheme has #t/#f and a
disjoint empty list; CL has T and NIL with NIL being the same as the
empty list, etc.

It's clear that in a portable notation, () has to stand for the empty
list for symmetry with the rest of the list syntax.

IMHO a portable syntax shouldn't assign special meaning to symbols in
the style of CL's NIL (which is actually an abbreviation of
COMMON-LISP:NIL -- a NIL symbol in a package other than COMMON-LISP does
not necessarily mean the empty list).

IMHO the following would be best:

- Don't specify a boolean datatype.

- Suggest the use of the symbols true/false or t/f as a convention, but
do not require this or specify any special handling for it.

- nil and t are not read in as special symbols.

[This is off topic for Scheme, but in Common Lisp implementations it
might make sense to have (defvar f nil) so people can use T and F for
booleans. CL programmers can rebind global variables for the duration of
a dynamic extent, so CL libraries that read formats like JSON or POSE
could consult the dynamic value of F to figure out how to convert
boolean false from the external notation to a Lisp value. For example,
(let ((f 'false)) (json-read)) would convert it to the symbol 'false.]

> Is the goal here _all_ lisps, all schemes, all CLs... ?

All Lisp dialects (as well as non-Lisp languages whose users want to
read and write S-expressions).

> If the goal is all lisps and lisp variants, where is the line going to
> be drawn? Arguably, Ruby, for example, is a lisp variant, as it was
> first implemented in CL, and Python started out, at least, as being a
> lisp with tabs instead of ().

I already wrote a Python library, and will write a Ruby one as well.

> If I may be so bold as to suggest, if the goal is _all_ lisps, someone
> should present at ELS in a few weeks to get buy-in from the CL
> community. (Even if it's just all schemes, it still may be a useful
> thing to do, as they may have thought of something the scheme community
> hasn't.)

I avoid conferences but if someone else wants to present, no objection.

The idea of a portable syntax is to strongly favor stuff that is already
standard in existing syntaxes, so there ought not to be that much
controversy, but feedback is always welcome. In case of controversy,
it's probably best to err on the side of leaving things out.

One thing I'd like to leave out is dotted pairs. Those are difficult to
represent in languages where lists are vectors, which is most languages
outside the Lisp family. Another point against dotted pairs is that they
are most useful in situations where other idiosyncratic syntax from a
particular Lisp dialect is called for as well. For example, a
substantial amount of Scheme code is not directly representable in POSE
due to the lack of booleans, vectors, and datum comments, which loses
that use case of dotted pairs.