[gambit-list] questions about define-type, and structures in general
Matthew Koichi Grimes
mkg at cs.nyu.edu
Sun May 22 16:10:01 EDT 2011
On Sun, May 22, 2011 at 6:39 AM, Mikael <mikael.rcv at gmail.com> wrote:
> Why would you want this?
As Adrien mentioned, it's a common practice in other languages, which I got
used to (Python: override __repr__(), c++: override operator<<(), Java:
override ToString(), etc). In my particular case, I was writing a
doubly-linked list type, and wanted it to print (up to) its first three and
last three values when displayed in the REPL.
> Anyhow, you could make your own Gambit patch that adds a pp: procedure
> argument to define-type. Feel free to publish your patch on the Dumping
I'll start by learning how to write macros! :D
>> Similarly, how can I define a custom constructor that does something more
>> complicated than assign arguments to slots?
> By defining your own procedure that does the job.
I figured it out. Here's an expanded answer for other beginners. It's
actually as easy as:
constructor: (lambda (<args>) <body>)
> Someone else please verify that Gambit's define-record-type is just an
> alternative name for define-type, just like what call/cc is to
> call-with-current-continuation .
It seems that they aren't equivalent. Gambit's define-record-type comes from
srfi-9, which uses positional arguments rather than define-type's keyword
>From the example in the above link, we see that you can define a "pare"
(pair) type as follows:
(kons x y)
(x kar set-kar!)
We can then do a quick smoke-check to see that it worked:
> (pare? (kons 1 2))
If we restart the interpreter and repeat the above two steps, this
time using define-type instead of define-record type, we get:
> (define-type :pare (kons x y) pare? (x kar set-kar!) (y kdr))
> (pare? (kons 1 2))
*** ERROR IN (console)@2.2 -- Unbound variable: pare?
That said, define-record-type does seem to be defined in terms of
define-type, as can be seen in ~~/lib/nonstd.scm. Also,
define-structure is equivalent to define-type:
(define-runtime-macro (define-type . args)
(##define-type-expand 'define-type #f #f args))
(define-runtime-macro (define-structure . args)
(##define-type-expand 'define-structure #f #f args))
(define-runtime-macro (define-record-type name constructor predicate . fields)
, at fields))
>> Gambit-list mailing list
>> Gambit-list at iro.umontreal.ca
> Gambit-list mailing list
> Gambit-list at iro.umontreal.ca
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Gambit-list