unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
From: Arne Babenhauserheide <arne_bab-S0/GAf8tV78@public.gmane.org>
To: guile-user-mXXj517/zsQ@public.gmane.org,
	readable-discuss
	<readable-discuss-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>
Subject: wisp literal array syntax for Guile, a good idea?
Date: Sun, 12 Nov 2017 19:34:31 +0100	[thread overview]
Message-ID: <87mv3rgrwk.fsf@web.de> (raw)


[-- Attachment #1.1: Type: text/plain, Size: 3929 bytes --]

Hi,

Wisp¹ as general syntax is pretty much done. The releases this year only
provided bug fixes and additional examples. A procedure definition looks
like this:

define : hello who
    format #f "Hello ~a!\n"
                   . who

From experience with building tools with Wisp² I am pretty happy with
its syntax; it feels like a sweet spot between minimal syntax-overhead
and producing easily readable code (leaning a bit more towards minimal
syntax-overhead than readable/sweet).

But there is one Guile-specific feature where it is lacking: When
defining a procedure in Guile, you can add properties by creating a
literal array as line — or as second line if the first line is a literal
string that then serves as documentation. This can be used to define
tests.³ Then a full fledged Hello World! looks like this:

define : hello who
    . "Say hello to WHO"
    . #((tests
           (test-equal "Hello World!\n"
                      (hello "World"))))
    format #f "Hello ~a!\n"
                   . who

And this is all and nice, but it prevents using indentation-based syntax
for the properties. This would be no problem if I could simply make an
array with non-literal syntax — i.e. (list->array (list (list tests
(list test-eqv ...)))) — but Guile property syntax requires a literal
array.

Therefore I created a reader-extension⁴ which allows creating literal
arrays with indentation-based syntax using the hash-extension ##:

define : hello who
    . "Say hello to WHO"
    ##
        tests
            test-equal "Hello World!\n"
                       hello "World"
    format #f "Hello ~a!\n"
                   . who

To my eyes this looks reasonably nice, and it allows using arbitrary
arrays. It uses the conventional #-extension common to Scheme which
avoids adding more constructs, and internally it just passes
## a b c
to the wisp paren-restructuring code as
(#\# a b c)
which then becomes
#(a b c)
as used in similar fashion for the other special paren-prefixes
("'" "," "#'", ...).

But it feels strange to add specialized syntax here. I would rather want
something more general — something which does not feel like opening a
can of worms of more and more syntax elements which could crop in. It
feels like straying from the path of simplicity.

Therefore I’d like to ask you for comments. Do you have ideas how this
could be made more elegant? Or is this intrinsic complexity of the
Scheme or Guile literal array prefix (and the other paren-prefixes)
which I cannot escape with wisp?

Best wishes,
Arne

¹: Wisp website: http://www.draketo.de/english/wisp

²: Wisp examples (tools with wisp):
   https://bitbucket.org/ArneBab/wisp/src/e80659fcc896ab04fbcd0a2d78e0dc25fef474a0/examples/

³: This doctest syntax is built on SRFI-64 and implemented in
   <https://bitbucket.org/ArneBab/wisp/src/e80659fcc896ab04fbcd0a2d78e0dc25fef474a0/examples/doctests.w>
   and
   <https://bitbucket.org/ArneBab/wisp/src/e80659fcc896ab04fbcd0a2d78e0dc25fef474a0/examples/doctests.scm>

⁴: The code for the reader extension consists of a single line in the reader:
       read-hash-extend #\# : λ (chr port) #\#
   <https://bitbucket.org/ArneBab/wisp/src/e80659fcc896ab04fbcd0a2d78e0dc25fef474a0/wisp-reader.w#wisp-reader.w-39>
   eight lines in the clean parser (currently mostly a hack)
   <https://bitbucket.org/ArneBab/wisp/src/e80659fcc896ab04fbcd0a2d78e0dc25fef474a0/wisp-scheme.w#wisp-scheme.w-689>
   and some special cases in the bootstrap parser and wisp->lisp converter which operates on bare strings
   <https://bitbucket.org/ArneBab/wisp/src/e80659fcc896ab04fbcd0a2d78e0dc25fef474a0/wisp-guile.w#wisp-guile.w-513>
   <https://bitbucket.org/ArneBab/wisp/src/e80659fcc896ab04fbcd0a2d78e0dc25fef474a0/wisp-guile.w#wisp-guile.w-567>
-- 
Unpolitisch sein
heißt politisch sein
ohne es zu merken

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

[-- Attachment #2: Type: text/plain, Size: 202 bytes --]

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

[-- Attachment #3: Type: text/plain, Size: 207 bytes --]

_______________________________________________
Readable-discuss mailing list
Readable-discuss-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/readable-discuss

             reply	other threads:[~2017-11-12 18:34 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-12 18:34 Arne Babenhauserheide [this message]
2017-11-12 21:20 ` wisp literal array syntax for Guile, a good idea? Matt Wette
     [not found]   ` <098670CE-873B-4DCC-A111-A88044861BBD-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-11-12 22:38     ` Arne Babenhauserheide
     [not found]       ` <87k1yvglih.fsf-S0/GAf8tV78@public.gmane.org>
2017-12-12 22:58         ` Alan Manuel Gloria
     [not found]           ` <CAF+kUQW-m2=OPB1Fjf9_r0ftBj5d_c4NSag-r+HfFtkLEvoomw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2017-12-13 17:29             ` Arne Babenhauserheide

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87mv3rgrwk.fsf@web.de \
    --to=arne_bab-s0/gaf8tv78@public.gmane.org \
    --cc=guile-user-mXXj517/zsQ@public.gmane.org \
    --cc=readable-discuss-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).