[gambit-list] Macros in Black Hole

Mikael mikael.trash at gmail.com
Fri Feb 5 07:25:40 EST 2010


Then  (import nameofyourlibrary), presuming it is located
in nameofyourlibrary.scm in your current working
directory. (module-compile!) it first if it does not contain C FFI calls
(which would force compile on import) and you want it compiled.

2010/2/5 Álvaro Castro-Castilla <alvaro.castro.castilla at gmail.com>

> El 5 de febrero de 2010 10:51, Per Eckerdal <per.eckerdal at gmail.com>escribió:
>
>
>> 5 feb 2010 kl. 01.25 skrev Álvaro Castro-Castilla:
>>
>> > Hi!
>> >
>> > I'm new to this list and also to Gambit. I'm trying to get used to it,
>> and I like most of the things very much (taking into account that I'm new to
>> Scheme).
>> >
>> > I'm trying to use Black Hole module system, and I've found out something
>> that I don't understand how it works or what I'm doing wrong.
>> >
>> > If you have this scheme file, called for example "bhtest.scm"
>> >
>> > (load "/usr/lib/modules/build")
>> > (import (std srfi/14))
>> >
>> >
>> > and you try to execute it with "gsc -i bhtest.scm", you'll get this:
>> >
>> > *** ERROR IN "blackhole.scm"@3.2 -- Unbound variable: import
>>
>> I think a clarification to why this doesn't work (and the same code in the
>> REPL does) would be helpful not only to understand Black Hole, but also
>> other similar issues.
>>
>> When you type the load expression into the REPL, Gambit will load Black
>> Hole, and Black Hole will override two hooks, ##expand-source and
>> c#expand-source. These two functions are by default the identity function
>> (that is, (lambda (x) x)). ##expand-source is called every time code is
>> evaluated, and Black Hole adds its macro expander there.
>>
>> After loading BH in the REPL, BH's macro expander will be there, so in the
>> next line, when you type (import ...), BH will recognize it and take proper
>> action.
>>
>> However, when loading a file containing both (load
>> "/usr/lib/modules/build") and (import (std srfi/14)), what will happen is
>> that Gambit will parse the whole file, then call ##expand-source on the
>> resulting s-expression, then eval that expression. Black Hole will get
>> loaded, but when it is, the whole file's code will already have been
>> macro-expanded, so the import will be seen as a normal procedure call, which
>> obviously won't work.
>>
>> This is a kind problem that many people that are new to Gambit (and
>> probably other implementations of Scheme as well) seem to have. The
>> difference between typing something into the REPL, load-ing a file with the
>> same expressions, or include-ing a file is not very easy to understand at
>> first.
>>
>> For me, it helped to think like this (it's not entirely correct, but kind
>> of): It's possible to implement both load and include, assuming that
>> read-file is a function that reads a file's s-exps and wraps them in a
>> begin, as an example would bhtest.scm yield (begin (load
>> "/usr/lib/modules/build") (import (std srfi/14)))
>>
>> (define (load filename)
>>  (eval (read-file filename)))
>>
>> (define-macro (include filename)
>>  (read-file filename))
>>
>>
>> The main reason why you're not supposed to have a load expression inside
>> of your scheme files is that I have tried hard to design BH in a way that
>> makes it easy to share code. Having a load expression in the beginning of
>> each file would ruin that, because everyone will not have BH installed at
>> the same place. Also, this ensures that very simple code is kept very simple
>> and clean, yet it will scale and still be useful in larger applications. An
>> example of a typical BH module is a simple FIFO queue library that I have
>> written:
>>
>> http://github.com/pereckerdal/blackhole-libs/blob/master/ds/queue.scm
>>
>> It's possible to import it like this: (import "
>> http://github.com/pereckerdal/blackhole-libs/raw/master/ds/queue.scm")
>>
>>
>> This mail turned out somewhat messy, I hope it helps.
>>
>> /Per
>>
>>
> Thanks a lot for your explanations!
>
> It works with the code that you said in the .gambcini
> I understand now the reasons why it doesn't work, it makes sense.
> What I don't fully understand is why I'm not supposed to use "loads" now
> anymore... At the moment, I was compiling bindings and some "libraries" that
> I needed to use, to speed up the code, how am I supposed to deal with that
> now? (they were not done thinking in Black Hole, but they don't use any
> namespaces functionality, AFAIK).
>
> Thanks again for your prompt response.
>
> Álvaro Castro-Castilla
>
> _______________________________________________
> Gambit-list mailing list
> Gambit-list at iro.umontreal.ca
> https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20100205/0c3600ac/attachment.htm>


More information about the Gambit-list mailing list