From: ludo@gnu.org (Ludovic Courtès)
To: guile-devel@gnu.org
Subject: Re: Functional record “setters”
Date: Mon, 09 Apr 2012 23:00:23 +0200 [thread overview]
Message-ID: <87bon0boyg.fsf@gnu.org> (raw)
In-Reply-To: 87ty0s91l8.fsf@pobox.com
Hi Andy!
Thanks for your quick feedback!
Andy Wingo <wingo@pobox.com> skribis:
>> + (define-inlinable (modifier s val)
>> + (if (eq? (struct-vtable s) #,type-name)
>> + (struct-set! s index val)
>> + (throw 'wrong-type-arg 'modifier
>> + "Wrong type argument: ~S" (list s)
>> + (list s)))))))))
>
> Any better abstraction here? It can be a big win to just pass the
> vtable to some function, because you avoid emitting code and constants.
> (It will be nice to start to elide some of these checks in the
> optimizer...)
>
> E.g. (throw-bad-struct s 'modifier).
Indeed, will do.
> Same for the getter. ("Getter" and "setter" are better names IMO,
> because of other uses of the name "accessor" in Guile.)
“Modifier” was already in, but I should unify it, yes.
>> (syntax-case x ()
>> - ((_ type-name constructor-spec predicate-name field-spec ...)
>> + ((_ immutable? type-name constructor-spec predicate-name
>> + field-spec ...)
>
> I realize this is an internal macro, but it would be nice to support
> keywords (#:immutable), possibly without arguments...
Not sure I understand. Macros can have keyword arguments?
>> +;; Import (srfi srfi-9)'s private module, so we can use the private
>> +;; `%define-record-type' macro.
>> +(eval-when (compile eval load)
>> + (module-use! (current-module) (resolve-module '(srfi srfi-9))))
>
> Why not just use (@@ (srfi srfi-9) %define-record-type) ?
Indeed.
>> (%define-record-type)[functional-accessors]: Mimic `define-inlinable',
>> but add support for (ACCESSOR obj val), when `%reveal-setter' allows
>> it.
>
> This is confusing naming.
‘functional-accessors’ and ‘accessors’ produce code for both getters and
setters.
I used “accessor” to mean either “getter or setter”, or just “getter”,
which is what’s confusing, I think. I’ll improve that.
> I find the set-fields interface a bit strange, FWIW. Are you happy with
> it, or do you think it could be better? If you think it's really the
> thing to do, OK.
The goal was to have an interface close to what one would do in
imperative programming, that is:
person.address.city = "foo";
I think it’s quite successful at it.
Now, I’m open for suggestions. I don’t have any idea for a better
interface that meets this goal. For instance, having to spell out the
getter names may look verbose, but I don’t see how it can be avoided.
Any ideas?
Thanks,
Ludo’.
next prev parent reply other threads:[~2012-04-09 21:00 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-09 0:17 Functional record “setters” Ludovic Courtès
2012-04-09 18:55 ` Andy Wingo
2012-04-09 21:00 ` Ludovic Courtès [this message]
2012-04-10 1:19 ` Noah Lavine
2012-04-10 9:55 ` Ludovic Courtès
2012-04-10 14:18 ` Mark H Weaver
2012-04-10 14:27 ` Ludovic Courtès
2012-04-10 14:37 ` Noah Lavine
2012-04-10 15:15 ` Mark H Weaver
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87bon0boyg.fsf@gnu.org \
--to=ludo@gnu.org \
--cc=guile-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).