From: Neil Jerram <neil@ossau.uklinux.net>
Subject: Re: doc expression syntax, quoting
Date: 16 Feb 2004 20:08:32 +0000 [thread overview]
Message-ID: <m3wu6m7pof.fsf@laruns.ossau.uklinux.net> (raw)
In-Reply-To: <873c9c0z6k.fsf@zip.com.au>
>>>>> "Kevin" == Kevin Ryde <user42@zip.com.au> writes:
Kevin> This is some words to propose for the currently empty Expression
Kevin> Syntax section of the manual. In particular it describes quote and
Kevin> quasiquote, which don't otherwise appear in the manual.
Nice; just a few comments below.
Kevin> Expression Syntax
Kevin> =================
Kevin> An expression to be evaluated takes one of the following forms.
Kevin> - syntax: <symbol>
Kevin> A symbol is evaluated by dereferencing. A binding of that symbol
Kevin> is sought and the value there used. For example,
Kevin> (define x 123)
Kevin> x => 123
Kevin> - syntax: (proc [args ...])
Kevin> A parenthesised expression is a function call. PROC and each
Kevin> argument are evaluated, then the function (which PROC evaluated
Kevin> to) is called with those arguments.
Kevin> The order in which PROC and the arguments are evaluated is
Kevin> unspecified, so be careful when using expressions with side
Kevin> effects.
Kevin> (max 1 2 3) => 3
Kevin> (define (get-some-proc) min)
Kevin> ((get-some-proc) 1 2 3) => 1
Kevin> The same sort of parenthesised form is used for a macro invocation,
Kevin> but in that case the the macro is applied before evaluating the
Kevin> arguments. See the descriptions of macros for more on this (*note
Kevin> Macros::, and *note Syntax Rules::).
This suggests the args will still be evaluated, which is often not
true. How about "but in that case the arguments are not automatically
evaluated". (Note also "the the" typo.)
Kevin> - syntax: <constant>
Kevin> Number, string, character and boolean constants evaluate "to
Kevin> themselves", so can appear as literals.
Kevin> 123 => 123
Kevin> 99.9 => 99.9
Kevin> "hello" => "hello"
Kevin> #\z => #\z
Kevin> #t => #t
Kevin> Note that an application must not attempt to modify literal
Kevin> strings, since they may be in read-only memory.
Kevin> - syntax: quote data
Kevin> - syntax: ' data
Kevin> Quoting is used to obtain a literal symbol (instead of a variable
Kevin> reference), a literal list (instead of a function call), or a
Kevin> literal vector. ' is simply a shorthand for a `quote' form. For
Kevin> example,
Kevin> 'x => x
Kevin> '(1 2 3) => (1 2 3)
Kevin> '#(1 (2 3) 4) => #(1 (2 3) 4)
Kevin> (quote x) => x
Kevin> (quote (1 2 3)) => (1 2 3)
Kevin> (quote #(1 (2 3) 4)) => #(1 (2 3) 4)
Kevin> Note that an application must not attempt to modify literal lists
Kevin> or vectors obtained from a `quote' form, since they may be in
Kevin> read-only memory.
Kevin> - syntax: quasiquote data
Kevin> - syntax: ` data
Kevin> Backquote quasi-quotation is like `quote', but selected
Kevin> sub-expressions are evaluated. This is a convenient way to
Kevin> construct a list or vector structure most of which is constant,
Kevin> but at certain points should have expressions substituted.
Kevin> The same effect can always be had with suitable `list', `cons' or
Kevin> `vector' calls, but quasi-quoting is often easier.
Kevin> - syntax: unquote expr
Kevin> - syntax: , expr
Kevin> Within the quasiquote DATA, `unquote' or `,' indicates an
Kevin> expression to be evaluated and inserted. The comma syntax `,'
Kevin> is simply a shorthand for an `unquote' form. For example,
Kevin> `(1 2 ,(* 9 9) 3 4) => (1 2 81 3 4)
Kevin> `(1 (unquote (+ 1 1)) 3) => (1 2 3)
Kevin> `#(1 ,(/ 12 2)) => #(1 6)
Kevin> - syntax: unquote-splicing expr
Kevin> - syntax: , expr
Should be ,@ here.
Kevin> Within the quasiquote DATA, `unquote-splicing' or `,@'
Kevin> indicates an expression to be evaluated and the elements of
Kevin> the returned list inserted. EXPR must evaluate to a list.
Kevin> The "at-comma" syntax `,@' is simply a shorthand
Kevin> for an
Surely "comma-at", not "at-comma"?
Kevin> `unquote-splicing' form.
Kevin> (define x '(2 3))
Kevin> `(1 ,@x 4) => (1 2 3 4)
Kevin> `(1 (unquote-splicing (map 1+ x))) => (1 3 4)
Kevin> `#(9 ,@x 9) => #(9 2 3 9)
Kevin> Notice `,@' differs from plain `,' in the way one level of
Kevin> nesting is stripped. For `,@' the elements of a returned list
Kevin> are inserted, whereas with `,' it would be the list itself
Kevin> inserted.
Kevin> _______________________________________________
Kevin> Guile-devel mailing list
Kevin> Guile-devel@gnu.org
Kevin> http://mail.gnu.org/mailman/listinfo/guile-devel
_______________________________________________
Guile-devel mailing list
Guile-devel@gnu.org
http://mail.gnu.org/mailman/listinfo/guile-devel
next prev parent reply other threads:[~2004-02-16 20:08 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-02-15 22:12 doc expression syntax, quoting Kevin Ryde
2004-02-16 20:08 ` Neil Jerram [this message]
2004-02-18 0:37 ` Kevin Ryde
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=m3wu6m7pof.fsf@laruns.ossau.uklinux.net \
--to=neil@ossau.uklinux.net \
/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).