Hi Peeps! I'm running CHICKEN 4.9.0rc1 and I'm trying out the memoize egg.
I saw the tail-call-optimized version of the factorial procedure in the memoize documentation at http://api.call-cc.org/doc/memoize and I've been trying to modify it so that it memoizes intermediate results such that, for example, a call to (fact 10) makes a subsequent call to (fact 9) fast. In doing so I've managed to get the interpreter into a loop or crash it entirely. When pasting this into a csi prompt: ----- (use numbers) (use memoize) (define (fact** x #!optional (self memo-fact**)) (if (= x 0) 1 (* x (self (- x 1))))) (define memo-fact** (memoize fact**)) (define x (time (memo-fact** 35710))) (define x (time (memo-fact** 35720))) (define x (time (memo-fact** 35730))) ----- I get: ----- $ csi CHICKEN (c) 2008-2014, The Chicken Team (c) 2000-2007, Felix L. Winkelmann Version 4.9.0rc1 (rev 3cf1967) linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ] compiled 2014-04-17 on hd-t1179cl (Linux) ; loading /home/local/andyjpb/.csirc ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/parley.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/chicken.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/data-structures.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/extras.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/ports.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/posix.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/srfi-1.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/srfi-13.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/srfi-18.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/stty.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/srfi-69.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/foreign.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/foreigners.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/parley.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/stty.so ... #;1> (use numbers) ; loading /usr/local/chicken-4.9.0/lib/chicken/7/numbers.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/numbers.so ... #;2> (use memoize) #;2> #;2> (define (fact** x #!optional (self memo-fact**)) #;2> (if (= x 0) #;2> 1 #;2> (* x (self (- x 1))))) #;2> #;2> (define memo-fact** (memoize fact**)) #;2> #;2> (define x (time (memo-fact** 35710))) #;2> (define x (time (memo-fact** 35720))) #;2> (define x (time (memo-fact** 35730))) #;2> ; loading /usr/local/chicken-4.9.0/lib/chicken/7/memoize.import.so ... ; loading /usr/local/chicken-4.9.0/lib/chicken/7/memoize.so ... Note: the following toplevel variables are referenced but unbound: memo-fact** (in fact**) 2.804s CPU time, 1.064s GC time (major), 81305 mutations, 21/1551 GCs (major/minor) 0s CPU time, 20 mutations 0s CPU time, 20 mutations #;8> [panic] out of memory - heap full while resizing - execution terminated ...more... parley.scm:610: history817818 parley.scm:610: history817818 parley.scm:603: ##sys#dynamic-wind parley.scm:603: history798799 parley.scm:603: history798799 parley.scm:603: history798799 parley.scm:603: history798799 parley.scm:610: ##sys#dynamic-wind parley.scm:610: history817818 parley.scm:610: history817818 parley.scm:615: get-next-char! parley.scm:579: parley-char-ready? parley.scm:586: append-while-incomplete parley.scm:560: string-null? parley.scm:561: repl-prompt parley.scm:561: g769 <-- ----- Sometimes I'll crash immediately and someytimes I have to press some keys when the "#;8>" prompt appears. If I run the above script thusly: ----- $ csi -s memo-demo.scm ----- I see ----- $ csi -s ../memo-demo.scm 2.908s CPU time, 1.164s GC time (major), 75257 mutations, 22/1550 GCs (major/minor) 0s CPU time, 20 mutations ----- ...and it hangs there (on the last time call) indefinitely using all the CPU. Ctrl-C doesn't terminate it: a call to 'killall csi' does tho'. If you cannot reproduce it then try varying the numbers in the call to memo-fact**. Is this a known bug in Chicken 4.9.0rc1 or the srfi-69 hash-tables that memoize uses? Thanks for any tips you can offer. Regards, @ndy -- andy...@ashurst.eu.org http://www.ashurst.eu.org/ 0290 DA75 E982 7D99 A51F E46A 387A 7695 7EBA 75FF _______________________________________________ Chicken-users mailing list Chicken-users@nongnu.org https://lists.nongnu.org/mailman/listinfo/chicken-users