On Tue, Oct 30, 2018 at 12:55 AM Mark H Weaver 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' > macro. > > 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 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--- > mhw@jojen ~$ 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 (make-foo a b) foo? (a > foo-a) (b foo-b)) > scheme@(guile-user)> (match (make-foo 1 2) (($ a b) (+ a b))) > $1 = 3 > scheme@(guile-user)> (define $ 'blah) > scheme@(guile-user)> (match (make-foo 1 2) (($ a b) (+ a b))) > :6:0: Throw to key `match-error' with args `("match" "no > matching pattern" #< 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.