<div dir="ltr"><div dir="auto">> Thanks. I think I get the basic idea: There is hybrid language FFI memory management situation going on, and the terminate method for the non-Lisp language is not being called when you wish it were.</div><div dir="auto"><br></div><div dir="auto">I have to let Julia know it can reclaim memory about no longer referenced variables. And I want to use the CCL GC to let me know when it is GCing the memory related to some no longer bound variables. But it is the CCL: terminate method that allows that. There are some other CL implementations, at least SBCL, where I can give it directy a lambda form in such a way it does my job:</div><div dir="auto"><br></div><div dir="auto"><div style="color:rgb(186,190,216);background-color:rgb(41,45,62);font-family:Consolas,"Courier New",monospace;font-size:14px;line-height:19px;white-space:pre"><div>            (<span style="color:rgb(137,221,255);font-style:italic">let</span> ((ret (<span style="color:rgb(137,221,255);font-style:italic">make-instance</span> 'jlref <span style="color:rgb(137,221,255)">:id</span> id</div><div>                    <span style="color:rgb(137,221,255)">:type</span> (|jl_string_eval_string|</div><div>                        (<span style="color:rgb(137,221,255);font-style:italic">concatenate</span> 'string <span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">string(typeof(getindex(refs,</span>\"<span style="color:rgb(137,221,255)">"</span> id <span style="color:rgb(137,221,255)">"</span>\"<span style="color:rgb(195,232,141)">)))</span><span style="color:rgb(137,221,255)">"</span>)))))</div><div>                    <span style="color:rgb(137,221,255)">#</span>+:sbcl (sb-ext:finalize ret (<span style="color:rgb(137,221,255);font-style:italic">lambda</span> ()</div><div>                        (sb-concurrency:enqueue index <span style="color:rgb(137,221,255)">*</span>jqueue<span style="color:rgb(137,221,255)">*</span>))) ret)</div></div></div><div dir="auto"><br></div><div dir="auto"><br></div><div>Here is a sample session with SBCL,</div><div>)juliad is a system command that display the output of the command executed in Julia</div><div>)julia execute a command in Julia,</div><div>)lisp same thing but in CL subsystem</div><div>refs the indexed dictionary in Julia</div><div>*jqueue* a FIFO queue populated by the CL terminate command. Since Julia does not support multiple thread access through its library libjulia.so it is up to the main FriCAS (CL) thread to delete entries in Julia 'refs', so on user input,I check if some entries can be deleted in Julia, if so, I delete them. Notice, there is a code helper here, a printf in the C wrapper. </div><div><br></div><div><span style="background-color:rgb(41,45,62);color:rgb(186,190,216);font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre">FriCAS Computer Algebra System</span><br></div><div><div style="color:rgb(186,190,216);background-color:rgb(41,45,62);font-family:Consolas,"Courier New",monospace;font-size:14px;line-height:19px;white-space:pre"><div>Version: FriCAS <span style="color:rgb(247,140,108)">1.3</span>.<span style="color:rgb(247,140,108)">11</span><span style="color:rgb(137,221,255)">-</span>dev built with SBCL <span style="color:rgb(247,140,108)">2.4</span>.<span style="color:rgb(247,140,108)">4</span></div><div>    Timestamp: sam. <span style="color:rgb(247,140,108)">04</span> mai <span style="color:rgb(247,140,108)">2024</span> <span style="color:rgb(247,140,108)">22</span>:<span style="color:rgb(247,140,108)">03</span>:<span style="color:rgb(247,140,108)">28</span> CEST</div><div><span style="color:rgb(103,110,149);font-style:italic">-----------------------------------------------------------------------------</span></div><div>Issue )copyright to view copyright notices.</div><div>Issue )summary <span style="color:rgb(137,221,255);font-style:italic">for</span> a summary of useful system commands.</div><div>Issue )quit to leave FriCAS <span style="color:rgb(137,221,255)">and</span> <span style="color:rgb(137,221,255);font-style:italic">return</span> to shell.</div><div><span style="color:rgb(103,110,149);font-style:italic">-----------------------------------------------------------------------------</span></div><br><br><div>(<span style="color:rgb(247,140,108)">1</span>) <span style="color:rgb(137,221,255)">-></span> )juliad refs</div><div><span style="color:rgb(130,170,255)">IdDict</span><span style="color:rgb(255,203,107)">{String, Any}</span>()</div><div>(<span style="color:rgb(247,140,108)">1</span>) <span style="color:rgb(137,221,255)">-></span> a<span style="color:rgb(137,221,255)">:=</span><span style="color:rgb(130,170,255)">matrix</span>([[<span style="color:rgb(130,170,255)">urand01</span>(),<span style="color:rgb(130,170,255)">urand01</span>()],[<span style="color:rgb(130,170,255)">urand01</span>(),<span style="color:rgb(130,170,255)">urand01</span>()]])<span style="color:rgb(137,221,255)">$</span><span style="color:rgb(130,170,255)">JMATRIX</span>(JCFLOAT)</div><br><div><span style="color:rgb(247,140,108)">2</span><span style="color:rgb(137,221,255)">×</span><span style="color:rgb(247,140,108)">2</span> Matrix{Complex{BigFloat}}:</div><div><span style="color:rgb(247,140,108)">0.202264</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.215084im</span>  <span style="color:rgb(247,140,108)">0.837934</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.841468im</span></div><div><span style="color:rgb(247,140,108)">0.881676</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.53561im</span>   <span style="color:rgb(247,140,108)">0.643403</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.736287im</span></div><div>(<span style="color:rgb(247,140,108)">1</span>)  Julia Output</div><div>                           Type: <span style="color:rgb(130,170,255)">JuliaMatrix</span>(JuliaComplexFloat)</div><div>             Time: <span style="color:rgb(247,140,108)">0.05</span> (IN) <span style="color:rgb(137,221,255)">+</span> <span style="color:rgb(247,140,108)">1.72</span> (EV) <span style="color:rgb(137,221,255)">+</span> <span style="color:rgb(247,140,108)">2.48</span> (OT) <span style="color:rgb(137,221,255)">=</span> <span style="color:rgb(247,140,108)">4.26</span> sec <- include the time taken to load the Julia library</div><div>(<span style="color:rgb(247,140,108)">2</span>) <span style="color:rgb(137,221,255)">-></span> )julia <span style="color:rgb(130,170,255)">display</span>(refs)</div><div>IdDict{String, Any} with <span style="color:rgb(247,140,108)">7</span> entries:</div><div><span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">2873853940934582137</span><span style="color:rgb(137,221,255)">"</span> <span style="color:rgb(137,221,255)">=></span> <span style="color:rgb(247,140,108)">0.837934</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.841468im</span></div><div><span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">3013752598065164257</span><span style="color:rgb(137,221,255)">"</span> <span style="color:rgb(137,221,255)">=></span> <span style="color:rgb(247,140,108)">0.643403</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.736287im</span></div><div><span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">1799302827895858725</span><span style="color:rgb(137,221,255)">"</span> <span style="color:rgb(137,221,255)">=></span> <span style="color:rgb(247,140,108)">0.0</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.0im</span></div><div><span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">1193941380623146742</span><span style="color:rgb(137,221,255)">"</span> <span style="color:rgb(137,221,255)">=></span> <span style="color:rgb(247,140,108)">0.202264</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.215084im</span></div><div><span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">525699342094945562</span><span style="color:rgb(137,221,255)">"</span> <span style="color:rgb(137,221,255)">=></span> Complex{BigFloat}[<span style="color:rgb(247,140,108)">0.202264</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.215084im</span> <span style="color:rgb(247,140,108)">0.837934</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.841468im</span>; <span style="color:rgb(247,140,108)">0.881676</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.53561im</span> <span style="color:rgb(247,140,108)">0.643403</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.736287im</span>]</div><div><span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">2441597211547797803</span><span style="color:rgb(137,221,255)">"</span> <span style="color:rgb(137,221,255)">=></span> <span style="color:rgb(247,140,108)">1.0</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.0im</span></div><div><span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">2342493223442167775</span><span style="color:rgb(137,221,255)">"</span> <span style="color:rgb(137,221,255)">=></span> <span style="color:rgb(247,140,108)">0.881676</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.53561im</span></div><br><div>(<span style="color:rgb(247,140,108)">2</span>) <span style="color:rgb(137,221,255)">-></span> jlRef a</div><br><div>(<span style="color:rgb(247,140,108)">2</span>)  #<span style="color:rgb(137,221,255)"><</span>JLREF  Matrix{Complex{BigFloat}} <span style="color:rgb(247,140,108)">525699342094945562</span> {<span style="color:rgb(247,140,108)">100236</span>FE33}<span style="color:rgb(137,221,255)">></span></div><div>                                              Type: SExpression</div><div>                                     Time: <span style="color:rgb(247,140,108)">0.03</span> (OT) <span style="color:rgb(137,221,255)">=</span> <span style="color:rgb(247,140,108)">0.03</span> sec</div><div>(<span style="color:rgb(247,140,108)">3</span>) <span style="color:rgb(137,221,255)">-></span> )lisp <span style="color:rgb(137,221,255)">*</span>jqueue<span style="color:rgb(137,221,255)">*</span></div><br><div>Value <span style="color:rgb(137,221,255)">=</span> #<span style="color:rgb(130,170,255)">S</span>(SB<span style="color:rgb(137,221,255)">-</span>CONCURRENCY:QUEUE</div><div><span style="color:rgb(137,221,255)">:HEAD</span> #<span style="color:rgb(247,140,108)">1</span><span style="color:rgb(137,221,255)">=</span>(SB<span style="color:rgb(137,221,255)">-</span>CONCURRENCY::<span style="color:rgb(137,221,255)">.</span>DUMMY.)</div><div><span style="color:rgb(137,221,255)">:TAIL</span> #<span style="color:rgb(247,140,108)">1</span>#</div><div><span style="color:rgb(137,221,255)">:NAME</span> <span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">JuliaQueue</span><span style="color:rgb(137,221,255)">"</span>)</div><div>(<span style="color:rgb(247,140,108)">3</span>) <span style="color:rgb(137,221,255)">-></span> )clear all</div><div>All user variables <span style="color:rgb(137,221,255)">and</span> function definitions have been cleared.</div><div>(<span style="color:rgb(247,140,108)">1</span>) <span style="color:rgb(137,221,255)">-></span> a</div><br><div>(<span style="color:rgb(247,140,108)">1</span>)  a</div><div>                                              Type: <span style="color:rgb(130,170,255)">Variable</span>(a)</div><div>                                                    Time: <span style="color:rgb(247,140,108)">0</span> sec</div><div>(<span style="color:rgb(247,140,108)">2</span>) <span style="color:rgb(137,221,255)">-></span> )lisp <span style="color:rgb(137,221,255)">*</span>jqueue<span style="color:rgb(137,221,255)">*</span></div><br><div>Value <span style="color:rgb(137,221,255)">=</span> #<span style="color:rgb(130,170,255)">S</span>(SB<span style="color:rgb(137,221,255)">-</span>CONCURRENCY:QUEUE</div><div><span style="color:rgb(137,221,255)">:HEAD</span> #<span style="color:rgb(247,140,108)">1</span><span style="color:rgb(137,221,255)">=</span>(SB<span style="color:rgb(137,221,255)">-</span>CONCURRENCY::<span style="color:rgb(137,221,255)">.</span>DUMMY.)</div><div><span style="color:rgb(137,221,255)">:TAIL</span> #<span style="color:rgb(247,140,108)">1</span>#</div><div><span style="color:rgb(137,221,255)">:NAME</span> <span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">JuliaQueue</span><span style="color:rgb(137,221,255)">"</span>)</div><div>(<span style="color:rgb(247,140,108)">2</span>) <span style="color:rgb(137,221,255)">-></span> )lisp (reclaim)</div><br><div>Value <span style="color:rgb(137,221,255)">=</span> NIL</div><div>(<span style="color:rgb(247,140,108)">2</span>) <span style="color:rgb(137,221,255)">-></span> )lisp <span style="color:rgb(137,221,255)">*</span>jqueue<span style="color:rgb(137,221,255)">*</span></div><br><div>Value <span style="color:rgb(137,221,255)">=</span> #<span style="color:rgb(130,170,255)">S</span>(SB<span style="color:rgb(137,221,255)">-</span>CONCURRENCY:QUEUE</div><div><span style="color:rgb(137,221,255)">:HEAD</span> (SB<span style="color:rgb(137,221,255)">-</span>CONCURRENCY::<span style="color:rgb(137,221,255)">.</span>DUMMY. <span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">525699342094945562</span><span style="color:rgb(137,221,255)">"</span></div><div>    <span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">3013752598065164257</span><span style="color:rgb(137,221,255)">"</span> <span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">1193941380623146742</span><span style="color:rgb(137,221,255)">"</span></div><div>    <span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">2873853940934582137</span><span style="color:rgb(137,221,255)">"</span> . #<span style="color:rgb(247,140,108)">1</span><span style="color:rgb(137,221,255)">=</span>(<span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">2342493223442167775</span><span style="color:rgb(137,221,255)">"</span>))</div><div><span style="color:rgb(137,221,255)">:TAIL</span> #<span style="color:rgb(247,140,108)">1</span>#</div><div><span style="color:rgb(137,221,255)">:NAME</span> <span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">JuliaQueue</span><span style="color:rgb(137,221,255)">"</span>)</div><div>(<span style="color:rgb(247,140,108)">2</span>) <span style="color:rgb(137,221,255)">-></span> a<br></div><div>Freeing<span style="color:rgb(137,221,255)">..</span>. <span style="color:rgb(247,140,108)">525699342094945562</span></div><div><span style="color:rgb(247,140,108)">525699342094945562</span> freed</div><div>Freeing<span style="color:rgb(137,221,255)">..</span>. <span style="color:rgb(247,140,108)">3013752598065164257</span></div><div><span style="color:rgb(247,140,108)">3013752598065164257</span> freed</div><div>Freeing<span style="color:rgb(137,221,255)">..</span>. <span style="color:rgb(247,140,108)">1193941380623146742</span></div><div><span style="color:rgb(247,140,108)">1193941380623146742</span> freed</div><div>Freeing<span style="color:rgb(137,221,255)">..</span>. <span style="color:rgb(247,140,108)">2873853940934582137</span></div><div><span style="color:rgb(247,140,108)">2873853940934582137</span> freed</div><div>Freeing<span style="color:rgb(137,221,255)">..</span>. <span style="color:rgb(247,140,108)">2342493223442167775</span></div><div><span style="color:rgb(247,140,108)">2342493223442167775</span> freed</div><br><div>(<span style="color:rgb(247,140,108)">2</span>)  a</div><div>                                              Type: <span style="color:rgb(130,170,255)">Variable</span>(a)</div><div>                                     Time: <span style="color:rgb(247,140,108)">0.02</span> (IN) <span style="color:rgb(137,221,255)">=</span> <span style="color:rgb(247,140,108)">0.02</span> sec</div><div>(<span style="color:rgb(247,140,108)">3</span>) <span style="color:rgb(137,221,255)">-></span> )julia <span style="color:rgb(130,170,255)">display</span>(refs)</div><div>IdDict{String, Any} with <span style="color:rgb(247,140,108)">2</span> entries:</div><div><span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">1799302827895858725</span><span style="color:rgb(137,221,255)">"</span> <span style="color:rgb(137,221,255)">=></span> <span style="color:rgb(247,140,108)">0.0</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.0im</span></div><div><span style="color:rgb(137,221,255)">"</span><span style="color:rgb(195,232,141)">2441597211547797803</span><span style="color:rgb(137,221,255)">"</span> <span style="color:rgb(137,221,255)">=></span> <span style="color:rgb(247,140,108)">1.0</span><span style="color:rgb(137,221,255)">+</span><span style="color:rgb(247,140,108)">0.0im</span></div><br><div>(<span style="color:rgb(247,140,108)">3</span>) <span style="color:rgb(137,221,255)">-></span></div></div></div></div>