Hello.

I am new to clojure, but try it.

code:

(defn get-size [filename]
         (println 'size filename)
         (count filename))
(defn get-quickhash [filename]
         (println 'quickhash filename)
         (hash (take 3 filename)))
(defn get-hash [filename]
         (println 'hash filename)
         (hash filename))

(def get-info (memoize
              (fn [filename]
                (map #(% filename) [get-size get-quickhash get-hash]))))

(println "A")
(nth (get-info "abc") 0)
(nth (get-info "abc") 0)
(println "B")
(nth (get-info "abc") 0)
(nth (get-info "abc") 1)
(println "C")
(nth (get-info "abc") 0)
(nth (get-info "abc") 1)
(nth (get-info "abc") 2)
(println "D")
(nth (get-info "abc") 0)
(nth (get-info "abc") 1)
(nth (get-info "abc") 2)

result:

A
size abc
B
quickhash abc
C
hash abc
D


For memory efficiency, I suppose you may use state-monads and trie.
But it will need a lot of lines of code, and too hard for me.

Regards,

---------
Mikio Hokari

2009/5/28 Korny Sietsma <ko...@sietsma.com>:
>
> Hi all,
>
> I have some ruby code that I'm thinking of porting to clojure, but I'm
> not sure how to translate this idiom to a functional world:
> I have objects that are externally immutable, but have internal
> mutable state they use for optimisation, specifically in this case to
> defer un-needed calculations.
>
> Basically, I have a FileInfo class that wraps a data file, used to
> compare lots of files on my system.
> It has an "exact_match" method similar to:
>  def exact_match(other)
>     return false if size != other.size
>     return false if quickhash() != other.quickhash()
>     return hash() != other.hash()
>  end
>
> quickhash and hash store their results in instance variables so they
> only need to do the expensive calculations once - and quite often they
> never need to get calculated at all;  I'm looking for duplicate files,
> but many files have no duplicate, so probably never need to have their
> contents hashed.
>
> How would I do this in a functional way?  My first effort would be
> something like
>    (defn hash [filename] (memoize (... hash function ...)))
> but I have a couple of problems with this:
>  - it doesn't seem to store the hash value with the rest of the file
> information, which feels a bit ugly
>  - I assume it means storing the full filename three times, once in
> the original file info structure, once in the memoized hash function,
> and once in the memoized quickhash function.  My program struggles to
> get enough RAM to track as many files as I'd like already - storing
> the filename multiple times would blow out memory quite badly.
>
> I guess I could define a unique key for each filename, and define hash
> as a function on that key, but then hash would need to be able to
> access the list of filenames somehow.  It's starting to get beyond me
> - I'm hoping there's a simpler option!
>
> Any suggestions?  I'd hope this is not an uncommon idiom.
>
> - Korny
>
> --
> Kornelis Sietsma  korny at my surname dot com
> "Every jumbled pile of person has a thinking part
> that wonders what the part that isn't thinking
> isn't thinking of"
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to