-- Leo's gemini proxy
-- Connecting to idiomdrottning.org:1965...
-- Connected
-- Sending request
-- Meta line: 20 text/gemini; lang=en
Here’s an example of call-tables.
This is from brev2scm, which walks a .brev-file and tries to figure out what dependencies are used so that the resulting .scm file doesn’t need to depend on all of brev.
This is the code-walker (also uses tree-walk-preorder):
(define (see thing) (aif (belongs thing) (seen it thing) #f)) (import tree) (tree-walk-preorder see (with-input-from-file file-name read-list))
So for each node in the code that we read from file-name, we just call see which is this tiny little one-expression thing. And belongs and seen are just call-tables!
(define belongs (call-table)) (define seen (call-table*))
belongs is populated with this huge, hard-coded, thousand-line alist:
(belongs update: (alist->hash-table '((aand . anaphora) (acond . anaphora) (aif . anaphora) ...)))
When see sees something that belongs to a symbol like aand belongs to anaphora and aif also belongs to anaphora, it then stores that something under that symbol.
The two tables are each other’s inverses in that sense. When we see something we store it where it belongs, basically.
We end up with a database of everything we’ve seen that might belong somewhere, and where it belongs. A very brute-force but easy way to solve the problem.♥︎
-- Response ended
-- Page fetched on Thu Mar 28 13:07:28 2024