💾 Archived View for idiomdrottning.org › code-walking-with-call-tables captured on 2024-02-05 at 10:55:40. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2021-12-03)
-=-=-=-=-=-=-
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.♥︎