[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Proposal for a new (ice-9 history)

From: Mikael Djurfeldt
Subject: Re: Proposal for a new (ice-9 history)
Date: Tue, 30 Oct 2018 01:55:05 +0100

On Tue, Oct 30, 2018 at 12:55 AM Mark H Weaver <address@hidden> wrote:
However, there's a complication with using '$' in this way.  '$' is
already widely used as part of the syntax for (ice-9 match), to specify
patterns that match record objects.

Yes, I actually looked at this, but thought that $ would be interpreted as a literal inside the match _expression_, but was probably wrong according to what you write below:
  More precisely, it is a literal
identifier recognized by 'match' and related macros, in the same sense
that 'else' and '=>' are literal identifiers recognized by the 'cond'

R5RS section 4.3.2 (Pattern language) specifies how these literal
identifiers are to be compared with identifiers found in each macro use:

     Identifiers that appear in <literals> are interpreted as literal
     identifiers to be matched against corresponding subforms of the
     input.  A subform in the input matches a literal identifier if and
     only if it is an identifier and either both its occurrence in the
     macro _expression_ and its occurrence in the macro definition have
     the same lexical binding, or the two identifiers are equal and both
     have no lexical binding.

The implication is that these literal identifiers such as 'else', '=>'
and '$' lose their special meaning in any environment where they are
bound, unless the same binding is visible in the corresponding macro
definition environment.  R6RS and R7RS also specify this behavior.

For example:

--8<---------------cut here---------------start------------->8---
address@hidden ~$ guile
GNU Guile 2.2.3
Copyright (C) 1995-2017 Free Software Foundation, Inc.

Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.

Enter `,help' for help.
scheme@(guile-user)> ,use (ice-9 match)
scheme@(guile-user)> ,use (srfi srfi-9)
scheme@(guile-user)> (define-record-type <foo> (make-foo a b) foo? (a foo-a) (b foo-b))
scheme@(guile-user)> (match (make-foo 1 2) (($ <foo> a b) (+ a b)))
$1 = 3
scheme@(guile-user)> (define $ 'blah)
scheme@(guile-user)> (match (make-foo 1 2) (($ <foo> a b) (+ a b)))
<unnamed port>:6:0: Throw to key `match-error' with args `("match" "no matching pattern" #<<foo> a: 1 b: 2>)'.

Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]>
--8<---------------cut here---------------end--------------->8---

Incidentally, this does *not* throw an error in master (unless I made some mistake in this late hour), which then is a bug!

To avoid colliding with the popular 'match' syntax, how about making
'$$' the last value ($$0), and omitting the alias for '$$1'?

What do you think?

Not sure. This might be confusing for GDB users... Let's think about it.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]