guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Pure (side-effect-free) calls into c/c++?


From: Linus Björnstam
Subject: Re: Pure (side-effect-free) calls into c/c++?
Date: Sun, 12 Jan 2020 11:35:30 +0100
User-agent: Cyrus-JMAP/3.1.7-740-g7d9d84e-fmstable-20200109v1

Thanks!

I haven't used this macro in a billion years and wrote it as a comfort thingie 
for the first 100 project Euler problems. 

This thread got me to start thinking about how to memoize "smarter" and having 
a macro that allows you to trade a bit of speed for being able to specifically 
memoize the last n or the most common n arguments.

-- 
  Linus Björnstam

On Sun, 12 Jan 2020, at 04:03, Christopher Lam wrote:
> I can add a contribution! The good thing about memoize is it's simple 
> to create. You forgot a catch however: if the memoized return-val is #f 
> then your memoizer 
> https://hg.sr.ht/~bjoli/misc/browse/default/memoize.scm will not 
> recognise that #f is a valid cached return-val and will call the lambda 
> again. (FWIW I shudder think what a *fast* memoizer would do).
> 
> Here's how I did mine:
> 
> (define (memoize f)
>  (let ((h (make-hash-table)))
>  (lambda args
>  (cond
>  ((hash-ref h args) => car)
>  (else (let ((res (apply f args)))
>  (hash-set! h args (list res))
>  res))))))
> 
> (define-syntax-rule (lambda/macro args body ...)
>  (memoize (lambda args body ...)))
> 
> (define-syntax-rule (define/macro (f . args) body ...)
>  (define f lambda/macro args body ...))
> 
> 
> 
> On Sat, 11 Jan 2020 at 17:40, Linus Björnstam 
> <address@hidden> wrote:
> > I have a macro called lambda/memo and define/memo for these situations: 
> > https://hg.sr.ht/~bjoli/misc/browse/default/memoize.scm
> > 
> >  If the function gets called with a gazillion different arguments the 
> > memoizatiin hash gets large, and there are no mechanisms to stop that from 
> > happening. It also lacks a fast path for single argument functions.
> > 
> >  You can disregard the repo license. Use that function is you like, if you 
> > like to.
> > 
> > 
> >  -- 
> >  Linus Björnstam
> > 
> >  On Fri, 10 Jan 2020, at 23:36, Linas Vepstas wrote:
> >  > So, I've got lots of C code wrapped up in guile, and I'd like to declare
> >  > many of these functions to be pure functions, side-effect-free, thus
> >  > hopefully garnering some optimizations. Is this possible? How would I do
> >  > it? A cursory google-search reveals no clues.
> >  > 
> >  > To recap, I've got functions f and g that call into c++, but are pure 
> > (i.e.
> >  > always return the same value for the same arguments). I've got
> >  > user-written code that looks like this:
> >  > 
> >  > (define (foo x)
> >  > (g (f 42) (f x) (f 43))
> >  > 
> >  > and from what I can tell, `f` is getting called three times whenever the
> >  > user calls `foo`. I could tell the user to re-write their code to cache,
> >  > manually: viz:
> >  > 
> >  > (define c42 (f 42))
> >  > (define c43 (f 43))
> >  > (define (foo x) (g c42 (f x) c43))
> >  > 
> >  > but asking the users to do this is .. cumbersome. And barely worth it: 
> > `f`
> >  > takes under maybe 10 microseconds to run; so most simple-minded caching
> >  > stunts don't pay off. But since `foo` is called millions/billions of 
> > times,
> >  > I'm motivated to find something spiffy.
> >  > 
> >  > Ideas? suggestions?
> >  > 
> >  > -- Linas
> >  > -- 
> >  > cassette tapes - analog TV - film cameras - you
> >  >
> >



reply via email to

[Prev in Thread] Current Thread [Next in Thread]