* 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).