unofficial mirror of guile-devel@gnu.org 
 help / color / mirror / Atom feed
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’.




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