| I've written this code in two threads now (http://arclanguage.org/item?id=11129 and http://arclanguage.org/item?id=11104) to test memory efficiency by counting how many times *cons* is called.```
arc> (= cons-count* 0)
0
arc> (let old-cons cons
(def cons (x y)
(++ cons-count*)
(old-cons x y)))
*** redefining cons
#<procedure: cons>
```
This gets tedious because it clobbers *cons* and you need to restart your Arc session to get it back. So, a quick & dirty utility is born.```
(mac count-cons (expr)
(w/uniq (old-cons cons-count)
`(with (,old-cons cons ,cons-count 0)
(= cons (fn (x y) (++ ,cons-count) (,old-cons x y)))
(after (do1 ,expr
(prn "consed " (plural ,cons-count "time") "."))
(= cons ,old-cons)))))
```
It'll bog down run times, but it might be useful. It's even the beginning of a really simple call-counting profiler, if someone wants to explore the idea. Examples:```
arc> (count-cons (cons 1 2))
consed 1 time.
(1 . 2)
arc> (count-cons (map [apply + _] (pair '(1 3 5 7 9))))
consed 11 times.
(4 12 9)
arc> (count-cons (pair '(1 3 5 7 9) +))
consed 4 times.
(4 12 (9))
```
Feel free to improve upon this. I don't know if there are any glaring issues like thread-safety or something because I just jammed this out. |