* bug#12341: define does not support lambda shorthand notation, define-public does @ 2012-09-03 18:05 David Kastrup 2012-09-03 20:29 ` Ludovic Courtès 0 siblings, 1 reply; 9+ messages in thread From: David Kastrup @ 2012-09-03 18:05 UTC (permalink / raw) To: 12341 Having this supported in define-public but not in define seems like an inconsistency: dak@lola:/usr/local/tmp/lilypond$ guile GNU Guile 2.0.5-deb+1-1 Copyright (C) 1995-2012 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)> (define-public ((x a) b) a) scheme@(guile-user)> (define ((x a) b) a) While compiling expression: ERROR: Syntax error: unknown file:2:0: source expression failed to match any pattern in form (define ((x a) b) a) scheme@(guile-user)> The Scheme report does not mention this explicitly, but it would appear as a recursive application of the rule (define (a b) ...) -> (define a (lambda (b) ...)) leading first to (define (x a) (lambda (b) a)) and thence to (define x (lambda (a) (lambda (b) a))) And if it is not supposed to be supported, why is it supported with define-public? -- David Kastrup ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#12341: define does not support lambda shorthand notation, define-public does 2012-09-03 18:05 bug#12341: define does not support lambda shorthand notation, define-public does David Kastrup @ 2012-09-03 20:29 ` Ludovic Courtès 2012-09-04 12:21 ` Ian Price 0 siblings, 1 reply; 9+ messages in thread From: Ludovic Courtès @ 2012-09-03 20:29 UTC (permalink / raw) To: David Kastrup; +Cc: 12341 Hi David, David Kastrup <dak@gnu.org> skribis: > scheme@(guile-user)> (define-public ((x a) b) a) > scheme@(guile-user)> (define ((x a) b) a) > While compiling expression: > ERROR: Syntax error: > unknown file:2:0: source expression failed to match any pattern in form (define ((x a) b) a) For the latter, one should use (ice-9 curried-definitions), introduced in 2.0 (see ‘NEWS’), with code like this: (cond-expand (guile-2 (use-modules (ice-9 curried-definitions))) (else #t)) ; Guile 1.8 and earlier supports it That the former works is indeed inconsistent. It’s due to the fact that ‘define-public’ is implemented as a macro, whereas ‘define’ is a core form. I’m inclined to live with the inconsistency, but I’m open to suggestions. Thanks, Ludo’. PS: This was also discussed at <http://thread.gmane.org/gmane.comp.gnu.lilypond.devel/31461>. ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#12341: define does not support lambda shorthand notation, define-public does 2012-09-03 20:29 ` Ludovic Courtès @ 2012-09-04 12:21 ` Ian Price 2012-09-04 12:36 ` David Kastrup 2012-09-05 21:16 ` Ludovic Courtès 0 siblings, 2 replies; 9+ messages in thread From: Ian Price @ 2012-09-04 12:21 UTC (permalink / raw) To: Ludovic Courtès; +Cc: 12341, David Kastrup [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain; charset=iso-2022-jp-2, Size: 518 bytes --] ludo@gnu.org (Ludovic Court^[$(D+2^[(Bs) writes: > I^[$B!G^[(Bm inclined to live with the inconsistency, but I^[$B!G^[(Bm open to > suggestions. A quick git grep doesn't show any uses of curried define-public in the guile code base, so the fix is pretty simple. I'm open to better approaches though, since it does duplicate code, though this code is IMO trivial. -- Ian Price -- shift-reset.com "Programming is like pinball. The reward for doing it well is the opportunity to do it again" - from "The Wizardy Compiled" [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: define-public patch --] [-- Type: text/x-patch, Size: 1833 bytes --] From fb23b4a49e9c1f5c15ef0ceb2ee1903ebfddd71a Mon Sep 17 00:00:00 2001 From: Ian Price <ianprice90@googlemail.com> Date: Tue, 4 Sep 2012 13:18:58 +0100 Subject: [PATCH] `define-public' is no a longer curried definition by default. * module/ice-9/boot-9.scm (define-public): Remove currying functionality. * module/ice-9/curried-definitions.scm (define-public): New export. --- module/ice-9/boot-9.scm | 4 +++- module/ice-9/curried-definitions.scm | 14 +++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/module/ice-9/boot-9.scm b/module/ice-9/boot-9.scm index 5ed543a..cf8252a 100644 --- a/module/ice-9/boot-9.scm +++ b/module/ice-9/boot-9.scm @@ -3321,7 +3321,9 @@ module '(ice-9 q) '(make-q q-length))}." (define-syntax define-public (syntax-rules () ((_ (name . args) . body) - (define-public name (lambda args . body))) + (begin + (define name (lambda args . body)) + (export name))) ((_ name val) (begin (define name val) diff --git a/module/ice-9/curried-definitions.scm b/module/ice-9/curried-definitions.scm index d55f1fb..8c684a1 100644 --- a/module/ice-9/curried-definitions.scm +++ b/module/ice-9/curried-definitions.scm @@ -16,7 +16,8 @@ (define-module (ice-9 curried-definitions) #:replace ((cdefine . define) - (cdefine* . define*))) + (cdefine* . define*) + define-public)) (define-syntax cdefine (syntax-rules () @@ -39,3 +40,14 @@ (lambda* rest body body* ...))) ((_ . rest) (define* . rest)))) + +(define-syntax define-public + (syntax-rules () + ((_ (name . args) . body) + (begin + (cdefine (name . args) . body) + (export name))) + ((_ name val) + (begin + (define name val) + (export name))))) -- 1.7.7.6 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* bug#12341: define does not support lambda shorthand notation, define-public does 2012-09-04 12:21 ` Ian Price @ 2012-09-04 12:36 ` David Kastrup 2012-09-04 14:37 ` Ian Price 2012-09-05 21:16 ` Ludovic Courtès 1 sibling, 1 reply; 9+ messages in thread From: David Kastrup @ 2012-09-04 12:36 UTC (permalink / raw) To: Ian Price; +Cc: Ludovic Courtès, 12341 Ian Price <ianprice90@googlemail.com> writes: > ludo@gnu.org (Ludovic Courtès) writes: > >> I’m inclined to live with the inconsistency, but I’m open to >> suggestions. > A quick git grep doesn't show any uses of curried define-public in the > guile code base, so the fix is pretty simple. I'm open to better > approaches though, since it does duplicate code, though this code is IMO > trivial. Since this is a change from 1.8 behavior, would it be feasible to place a cross-reference to (ice-9 curried-definitions) into the manual entry for define ? At the current point of time, discoverability of this change is really bad. I can't find _any_ reference to it in the Guile manual (a plain text search for either "curried" or "curry" turns up nothing), so it seems like this is just a change sprung without notice or discoverable remedy on Guile users. I'd have expected a pointer at least somewhere (if not everywhere) among those links: <URL:http://www.gnu.org/software/guile/manual/html_node/Definition.html#Definition> <URL:http://www.gnu.org/software/guile/manual/html_node/Lambda-Alternatives.html#Lambda-Alternatives> -- David Kastrup ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#12341: define does not support lambda shorthand notation, define-public does 2012-09-04 12:36 ` David Kastrup @ 2012-09-04 14:37 ` Ian Price 0 siblings, 0 replies; 9+ messages in thread From: Ian Price @ 2012-09-04 14:37 UTC (permalink / raw) To: David Kastrup; +Cc: Ludovic Courtès, 12341 [-- Attachment #1: Type: text/plain, Size: 676 bytes --] David Kastrup <dak@gnu.org> writes: > I'd have expected a pointer at least somewhere (if not everywhere) among > those links: > > <URL:http://www.gnu.org/software/guile/manual/html_node/Definition.html#Definition> > > <URL:http://www.gnu.org/software/guile/manual/html_node/Lambda-Alternatives.html#Lambda-Alternatives> I agree, and have provided some documentation. I'm no texinfo expert so it probably needs cleanup. In particular, I wasn't sure of how to markup these curried forms. Comments kindly requested, -- Ian Price -- shift-reset.com "Programming is like pinball. The reward for doing it well is the opportunity to do it again" - from "The Wizardy Compiled" [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: curried define docs --] [-- Type: text/x-patch, Size: 4288 bytes --] From 6addaedac96ffe919d1b0cb58ed9992fbd240bf7 Mon Sep 17 00:00:00 2001 From: Ian Price <ianprice90@googlemail.com> Date: Tue, 4 Sep 2012 15:36:54 +0100 Subject: [PATCH] Document (ice-9 curried definitions) * doc/ref/Makefile.am(guile_TEXINFOS): Add curried.texi to list * doc/ref/curried.texi: New file. * doc/ref/guile.texi(Guile Modules): Add "Curried Definitions" to menu. * doc/ref/scheme-ideas.texi(Lambda Alternatives): Refer to "Curried Definitions" from the `define' section. --- doc/ref/Makefile.am | 1 + doc/ref/curried.texi | 53 +++++++++++++++++++++++++++++++++++++++++++++ doc/ref/guile.texi | 2 + doc/ref/scheme-ideas.texi | 5 ++++ 4 files changed, 61 insertions(+), 0 deletions(-) create mode 100644 doc/ref/curried.texi diff --git a/doc/ref/Makefile.am b/doc/ref/Makefile.am index abe9cb9..201ab6b 100644 --- a/doc/ref/Makefile.am +++ b/doc/ref/Makefile.am @@ -62,6 +62,7 @@ guile_TEXINFOS = preface.texi \ web.texi \ expect.texi \ scsh.texi \ + curried.texi \ sxml-match.texi \ scheme-scripts.texi \ api-overview.texi \ diff --git a/doc/ref/curried.texi b/doc/ref/curried.texi new file mode 100644 index 0000000..05475bd --- /dev/null +++ b/doc/ref/curried.texi @@ -0,0 +1,53 @@ +@c -*-texinfo-*- +@c This is part of the GNU Guile Reference Manual. +@c Copyright (C) 2012 +@c Free Software Foundation, Inc. +@c See the file guile.texi for copying conditions. + +@node Curried Definitions +@section Curried Definitions + +The macros in this section are provided by +@lisp +(use-modules (ice-9 curried-definitions)) +@end lisp +@noindent +and replace those provided by default. + +Prior to guile 2, guile provided a type of definition known colloquially +as a ``curried definition''. The idea is to extend the syntax of +@code{define} so that you can conveniently define procedures that return +procedures, up to any desired depth. + +For example, +@example +(define ((foo x) y) + (list x y)) +@end example +is a convenience form of +@example +(define foo + (lambda (x) + (lambda (y) + (list x y)))) +@end example + +@deffn {Syntax} define (@dots{} (name args @dots{}) @dots{}) expression @dots{} +A curried version of the default @code{define}. +@end deffn + +@deffn {Syntax} define* (@dots{} (name args @dots{}) @dots{}) expression @dots{} +A curried version of the default @code{define*}. Accepts all the options +@code{lambda*} does, for example, +@example +(define* ((foo #:keys (bar 'baz) (quux 'zot)) frotz #:rest rest) + (list bar quux frotz rest)) + +((foo #:quux 'foo) 1 2 3 4 5) +@result{} (baz foo 1 (2 3 4 5)) +@end example +@end deffn + +@deffn {Syntax} define-public (@dots{} (name args @dots{}) @dots{}) expression @dots{} +A curried version of the default @code{define-public}. +@end deffn diff --git a/doc/ref/guile.texi b/doc/ref/guile.texi index c3da0c3..a1b3fe6 100644 --- a/doc/ref/guile.texi +++ b/doc/ref/guile.texi @@ -370,6 +370,7 @@ available through both Scheme and C interfaces. * Expect:: Controlling interactive programs with Guile. * sxml-match:: Pattern matching of SXML. * The Scheme shell (scsh):: Using scsh interfaces in Guile. +* Curried Definitions:: Extended @code{define} syntax. @end menu @include slib.texi @@ -387,6 +388,7 @@ available through both Scheme and C interfaces. @include sxml-match.texi @include scsh.texi +@include curried.texi @node Standard Library @chapter Standard Library diff --git a/doc/ref/scheme-ideas.texi b/doc/ref/scheme-ideas.texi index 53f7b61..49297fd 100644 --- a/doc/ref/scheme-ideas.texi +++ b/doc/ref/scheme-ideas.texi @@ -476,6 +476,11 @@ The corresponding forms of the alternative @code{define} syntax are: @noindent For details on how these forms work, see @xref{Lambda}. +Prior to guile 2, guile provided an extension to @code{define} syntax +that allowed you to nest the previous extension up to an arbitrary +depth. These are no longer provided by default, and instead have been +moved to @ref{Curried Definitions} + (It could be argued that the alternative @code{define} forms are rather confusing, especially for newcomers to the Scheme language, as they hide both the role of @code{lambda} and the fact that procedures are values -- 1.7.7.6 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* bug#12341: define does not support lambda shorthand notation, define-public does 2012-09-04 12:21 ` Ian Price 2012-09-04 12:36 ` David Kastrup @ 2012-09-05 21:16 ` Ludovic Courtès 2012-09-06 20:27 ` Ian Price 1 sibling, 1 reply; 9+ messages in thread From: Ludovic Courtès @ 2012-09-05 21:16 UTC (permalink / raw) To: Ian Price; +Cc: 12341, David Kastrup Hello, Ian Price <ianprice90@googlemail.com> skribis: > From fb23b4a49e9c1f5c15ef0ceb2ee1903ebfddd71a Mon Sep 17 00:00:00 2001 > From: Ian Price <ianprice90@googlemail.com> > Date: Tue, 4 Sep 2012 13:18:58 +0100 > Subject: [PATCH] `define-public' is no a longer curried definition by > default. > > * module/ice-9/boot-9.scm (define-public): Remove currying functionality. > * module/ice-9/curried-definitions.scm (define-public): New export. Looks good to me. You now have commit access, so you’re welcome to commit it by yourself! :-) Please post patches before committing, for a start. Make sure to always rebase before committing, to avoid gratuitous merge commits if somebody else pushed changes in the meantime. If you have any doubts with Git, please ask us. > David Kastrup <dak@gnu.org> writes: > >> I'd have expected a pointer at least somewhere (if not everywhere) among >> those links: >> >> <URL:http://www.gnu.org/software/guile/manual/html_node/Definition.html#Definition> >> >> <URL:http://www.gnu.org/software/guile/manual/html_node/Lambda-Alternatives.html#Lambda-Alternatives> > > I agree, and have provided some documentation. +1. > I'm no texinfo expert so it probably needs cleanup. In particular, I > wasn't sure of how to markup these curried forms. > From 6addaedac96ffe919d1b0cb58ed9992fbd240bf7 Mon Sep 17 00:00:00 2001 > From: Ian Price <ianprice90@googlemail.com> > Date: Tue, 4 Sep 2012 15:36:54 +0100 > Subject: [PATCH] Document (ice-9 curried definitions) > > * doc/ref/Makefile.am(guile_TEXINFOS): Add curried.texi to list > * doc/ref/curried.texi: New file. > * doc/ref/guile.texi(Guile Modules): Add "Curried Definitions" to menu. > * doc/ref/scheme-ideas.texi(Lambda Alternatives): Refer to "Curried Definitions" > from the `define' section. Please leave a space before opening parentheses. > +++ b/doc/ref/curried.texi > @@ -0,0 +1,53 @@ > +@c -*-texinfo-*- > +@c This is part of the GNU Guile Reference Manual. > +@c Copyright (C) 2012 > +@c Free Software Foundation, Inc. No newline. > +@node Curried Definitions > +@section Curried Definitions > + > +The macros in this section are provided by > +@lisp > +(use-modules (ice-9 curried-definitions)) > +@end lisp > +@noindent > +and replace those provided by default. > + > +Prior to guile 2, guile provided a type of definition known colloquially Should be “Guile 2.0”. > +as a ``curried definition''. The idea is to extend the syntax of > +@code{define} so that you can conveniently define procedures that return > +procedures, up to any desired depth. > + > +For example, > +@example > +(define ((foo x) y) > + (list x y)) > +@end example > +is a convenience form of > +@example > +(define foo > + (lambda (x) > + (lambda (y) > + (list x y)))) > +@end example > + > +@deffn {Syntax} define (@dots{} (name args @dots{}) @dots{}) expression @dots{} It should be {Scheme Syntax}, for consistency with most of the manual. Instead of ‘expression’, what about ‘body @dots{}’? Also, I wonder whether the parentheses should appear at all, since it also accepts the flat form. OTOH, the only things worth describing is the parenthesized form. > +A curried version of the default @code{define}. > +@end deffn Please use a more formal, present-tense description, like “Create a top-level variable @var{name} bound to the procedure defined by @var{args}. @var{args} may be a list of formal parameters, possibly including nested formal parameter lists, in which case a higher-order procedure is created, as in the example above.” > +@deffn {Syntax} define* (@dots{} (name args @dots{}) @dots{}) expression @dots{} Here ‘deffnx’ could be used instead, like: @deffn {Scheme Syntax} define (@dots{} (name args @dots{}) @dots{}) body @dots{} @deffnx {Scheme Syntax} define* (@dots{} (name args @dots{}) @dots{}) body @dots{} [...] @code{define*} works similarly, and accepts all the options that @code{lambda*} accepts (@pxref{lambda* and define*}). For example: @example [...] @end example @end deffn > +@deffn {Syntax} define-public (@dots{} (name args @dots{}) @dots{}) expression @dots{} @deffnx too? > +Prior to guile 2, guile provided an extension to @code{define} syntax “Guile 2.0”. Thanks! Ludo’. ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#12341: define does not support lambda shorthand notation, define-public does 2012-09-05 21:16 ` Ludovic Courtès @ 2012-09-06 20:27 ` Ian Price 2012-09-06 20:37 ` Ludovic Courtès 0 siblings, 1 reply; 9+ messages in thread From: Ian Price @ 2012-09-06 20:27 UTC (permalink / raw) To: Ludovic Courtès; +Cc: 12341, David Kastrup [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain; charset=iso-2022-jp-2, Size: 2785 bytes --] ludo@gnu.org (Ludovic Court^[$(D+2^[(Bs) writes: > You now have commit access, so you^[$B!G^[(Bre welcome to commit it by yourself! > :-) I have :-) > > Please post patches before committing, for a start. Make sure to always > rebase before committing, to avoid gratuitous merge commits if somebody > else pushed changes in the meantime. If you have any doubts with Git, > please ask us. Rebasing is already standard practice when sending patches, so no trouble there. >> * doc/ref/Makefile.am(guile_TEXINFOS): Add curried.texi to list >> * doc/ref/curried.texi: New file. >> * doc/ref/guile.texi(Guile Modules): Add "Curried Definitions" to menu. >> * doc/ref/scheme-ideas.texi(Lambda Alternatives): Refer to "Curried Definitions" >> from the `define' section. > > Please leave a space before opening parentheses. Fixed. >> +++ b/doc/ref/curried.texi >> @@ -0,0 +1,53 @@ >> +@c -*-texinfo-*- >> +@c This is part of the GNU Guile Reference Manual. >> +@c Copyright (C) 2012 >> +@c Free Software Foundation, Inc. > > No newline. Can you tell I just mimicked the nearest file? Fixed. >> +Prior to guile 2, guile provided a type of definition known colloquially > > Should be ^[$B!H^[(BGuile 2.0^[$B!I^[(B. Fixed. >> +@deffn {Syntax} define (@dots{} (name args @dots{}) @dots{}) expression @dots{} > > It should be {Scheme Syntax}, for consistency with most of the manual. Fixed. > Instead of ^[$B!F^[(Bexpression^[$B!G^[(B, what about ^[$B!F^[(Bbody @dots{}^[$B!G^[(B? Fixed. > Also, I wonder whether the parentheses should appear at all, since it > also accepts the flat form. OTOH, the only things worth describing is > the parenthesized form. That was my thinking. >> +A curried version of the default @code{define}. >> +@end deffn > > Please use a more formal, present-tense description, like ^[$B!H^[(BCreate a > top-level variable @var{name} bound to the procedure defined by > @var{args}. @var{args} may be a list of formal parameters, possibly > including nested formal parameter lists, in which case a higher-order > procedure is created, as in the example above.^[$B!I^[(B I was having a hard time adequately describing it, and thought it was better to show by example than give a bad formal description. Anyway, I hope I've met your expectations with this one. >> +@deffn {Syntax} define* (@dots{} (name args @dots{}) @dots{}) expression @dots{} > > Here ^[$B!F^[(Bdeffnx^[$B!G^[(B could be used instead, like: I was not aware of that options, done. >> +Prior to guile 2, guile provided an extension to @code{define} syntax > > ^[$B!H^[(BGuile 2.0^[$B!I^[(B. Fixed. David, How about you, any feedback on this documentation? -- Ian Price -- shift-reset.com "Programming is like pinball. The reward for doing it well is the opportunity to do it again" - from "The Wizardy Compiled" [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: Curried Documentation Mark II --] [-- Type: text/x-patch, Size: 4659 bytes --] From 4f4783096d1052e6e7532acfed21616556c9c456 Mon Sep 17 00:00:00 2001 From: Ian Price <ianprice90@googlemail.com> Date: Thu, 6 Sep 2012 21:21:47 +0100 Subject: [PATCH] Document (ice-9 curried definitions) * doc/ref/Makefile.am (guile_TEXINFOS): Add curried.texi to list * doc/ref/curried.texi: New file. * doc/ref/guile.texi (Guile Modules): Add "Curried Definitions" to menu. * doc/ref/scheme-ideas.texi (Lambda Alternatives): Refer to "Curried Definitions" from the `define' section. --- doc/ref/Makefile.am | 1 + doc/ref/curried.texi | 56 +++++++++++++++++++++++++++++++++++++++++++++ doc/ref/guile.texi | 2 + doc/ref/scheme-ideas.texi | 5 ++++ 4 files changed, 64 insertions(+), 0 deletions(-) create mode 100644 doc/ref/curried.texi diff --git a/doc/ref/Makefile.am b/doc/ref/Makefile.am index abe9cb9..201ab6b 100644 --- a/doc/ref/Makefile.am +++ b/doc/ref/Makefile.am @@ -62,6 +62,7 @@ guile_TEXINFOS = preface.texi \ web.texi \ expect.texi \ scsh.texi \ + curried.texi \ sxml-match.texi \ scheme-scripts.texi \ api-overview.texi \ diff --git a/doc/ref/curried.texi b/doc/ref/curried.texi new file mode 100644 index 0000000..f12907e --- /dev/null +++ b/doc/ref/curried.texi @@ -0,0 +1,56 @@ +@c -*-texinfo-*- +@c This is part of the GNU Guile Reference Manual. +@c Copyright (C) 2012 Free Software Foundation, Inc. +@c See the file guile.texi for copying conditions. + +@node Curried Definitions +@section Curried Definitions + +The macros in this section are provided by +@lisp +(use-modules (ice-9 curried-definitions)) +@end lisp +@noindent +and replace those provided by default. + +Prior to guile 2.0, guile provided a type of definition known colloquially +as a ``curried definition''. The idea is to extend the syntax of +@code{define} so that you can conveniently define procedures that return +procedures, up to any desired depth. + +For example, +@example +(define ((foo x) y) + (list x y)) +@end example +is a convenience form of +@example +(define foo + (lambda (x) + (lambda (y) + (list x y)))) +@end example + +@deffn {Scheme Syntax} define (@dots{} (name args @dots{}) @dots{}) body @dots{} +@deffnx {Scheme Syntax} define* (@dots{} (name args @dots{}) @dots{}) body @dots{} +@deffnx {Scheme Syntax} define-public (@dots{} (name args @dots{}) @dots{}) body @dots{} + +Create a top level variable @var{name} bound to the procedure with +parameter list @var{args}. If @var{name} is itself a formal parameter +list, then a higher order procedure is created using that +formal-parameter list, and returning a procedure that has parameter list +@var{args}. This nesting may occur to arbitrary depth. + +@code{define*} is similar but the formal parameter lists take additional +options as described in @ref{lambda* and define*}. For example, +@example +(define* ((foo #:keys (bar 'baz) (quux 'zot)) frotz #:rest rest) + (list bar quux frotz rest)) + +((foo #:quux 'foo) 1 2 3 4 5) +@result{} (baz foo 1 (2 3 4 5)) +@end example + +@code{define-public} is similar to @code{define} but it also adds +@var{name} to the list of exported bindings of the current module. +@end deffn diff --git a/doc/ref/guile.texi b/doc/ref/guile.texi index c3da0c3..a1b3fe6 100644 --- a/doc/ref/guile.texi +++ b/doc/ref/guile.texi @@ -370,6 +370,7 @@ available through both Scheme and C interfaces. * Expect:: Controlling interactive programs with Guile. * sxml-match:: Pattern matching of SXML. * The Scheme shell (scsh):: Using scsh interfaces in Guile. +* Curried Definitions:: Extended @code{define} syntax. @end menu @include slib.texi @@ -387,6 +388,7 @@ available through both Scheme and C interfaces. @include sxml-match.texi @include scsh.texi +@include curried.texi @node Standard Library @chapter Standard Library diff --git a/doc/ref/scheme-ideas.texi b/doc/ref/scheme-ideas.texi index 53f7b61..cbf1a5c 100644 --- a/doc/ref/scheme-ideas.texi +++ b/doc/ref/scheme-ideas.texi @@ -476,6 +476,11 @@ The corresponding forms of the alternative @code{define} syntax are: @noindent For details on how these forms work, see @xref{Lambda}. +Prior to guile 2.0, guile provided an extension to @code{define} syntax +that allowed you to nest the previous extension up to an arbitrary +depth. These are no longer provided by default, and instead have been +moved to @ref{Curried Definitions} + (It could be argued that the alternative @code{define} forms are rather confusing, especially for newcomers to the Scheme language, as they hide both the role of @code{lambda} and the fact that procedures are values -- 1.7.7.6 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* bug#12341: define does not support lambda shorthand notation, define-public does 2012-09-06 20:27 ` Ian Price @ 2012-09-06 20:37 ` Ludovic Courtès 2012-09-06 21:37 ` Ian Price 0 siblings, 1 reply; 9+ messages in thread From: Ludovic Courtès @ 2012-09-06 20:37 UTC (permalink / raw) To: Ian Price; +Cc: 12341, David Kastrup Hi! Ian Price <ianprice90@googlemail.com> skribis: > ludo@gnu.org (Ludovic Courtès) writes: > >> You now have commit access, so you’re welcome to commit it by yourself! >> :-) > I have :-) Great, thanks! >> Please post patches before committing, for a start. Make sure to always >> rebase before committing, to avoid gratuitous merge commits if somebody >> else pushed changes in the meantime. If you have any doubts with Git, >> please ask us. > Rebasing is already standard practice when sending patches, so no > trouble there. Yeah, that’s what I suspected anyway. ;-) > +Prior to guile 2.0, guile provided a type of definition known colloquially Should really be “Guile 2.0” and “Guile”, with a capital ‘G’, when talking about the package. Other than that, looks good to me. Thank you! Ludo’. ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#12341: define does not support lambda shorthand notation, define-public does 2012-09-06 20:37 ` Ludovic Courtès @ 2012-09-06 21:37 ` Ian Price 0 siblings, 0 replies; 9+ messages in thread From: Ian Price @ 2012-09-06 21:37 UTC (permalink / raw) To: Ludovic Courtès; +Cc: 12341, David Kastrup, 12341-done [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain; charset=iso-2022-jp-2, Size: 441 bytes --] ludo@gnu.org (Ludovic Court^[$(D+2^[(Bs) writes: > Should really be ^[$B!H^[(BGuile 2.0^[$B!I^[(B and ^[$B!H^[(BGuile^[$B!I^[(B, with a capital ^[$B!F^[(BG^[$B!G^[(B, when > talking about the package. Ah, of course. Fixed and Pushed. Thanks David for the report, I'm marking this as done. -- Ian Price -- shift-reset.com "Programming is like pinball. The reward for doing it well is the opportunity to do it again" - from "The Wizardy Compiled" ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2012-09-06 21:37 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-09-03 18:05 bug#12341: define does not support lambda shorthand notation, define-public does David Kastrup 2012-09-03 20:29 ` Ludovic Courtès 2012-09-04 12:21 ` Ian Price 2012-09-04 12:36 ` David Kastrup 2012-09-04 14:37 ` Ian Price 2012-09-05 21:16 ` Ludovic Courtès 2012-09-06 20:27 ` Ian Price 2012-09-06 20:37 ` Ludovic Courtès 2012-09-06 21:37 ` Ian Price
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).