[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Weird behavior of hash-table
From: |
Mark H Weaver |
Subject: |
Re: Weird behavior of hash-table |
Date: |
Sun, 24 Nov 2019 06:00:43 -0500 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) |
Hi tomás,
<address@hidden> wrote:
> So the best thing for one's brain is to train it to read #(...)
> as some weird relative of '(...)?
Yes. They are both literals, and no part of a literal is evaluated.
#(...) is actually a shorthand for '#(...), and incidentally, one which
was not standardized until the R7RS. In portable R[3456]RS code, you
must explicitly quote vector literals.
It's important to distinguish between an expression and the value(s) it
evaluates to. It's easy to confuse them in Scheme, where every
expression is a value, but not necessarily the same value that it
evaluates to. For example, the expression (+ 1 1) is a list of length 3
which evaluates to the number 2. Similarly, 'A1, which is a shorthand
for (quote A1), is a list of two symbols which evaluates to the symbol
A1. Only the "self-evaluating" values evaluate to themselves.
In general, you should not put a quote (') anywhere that you could not
write (+ 1 1) in place of 2, unless of course you *want* a list starting
with the symbol 'quote'.
> Is there a corresponding weird relative of `(...)?
Yes. Remember that #(...) is a shorthand for '#(...). You can replace
the "'" with "`", just as you would for a quasiquoted list. For
example:
scheme@(guile-user)> `#(1 2 3)
$1 = #(1 2 3)
scheme@(guile-user)> `#(1 ,(+ 1 1) 3)
$2 = #(1 2 3)
scheme@(guile-user)> `#(1 (+ 1 1) 3)
$3 = #(1 (+ 1 1) 3)
Regards,
Mark