What's the benefit to writing code like this?

The only thing I could possibly see as being considered an advantage is
that it encapsulates the file channel, but you've exposed that via a key
anyway.

- James

On 21 November 2015 at 02:54, William la Forge <laforg...@gmail.com> wrote:

> Code as data is the mantra. Functions and closures as data. So why not
> objects as data? What I propose is nothing new, but perhaps a new style.
>
> Making objects from map structures is simple enough in Clojure. And easy
> enough to put functions in a map. So why not closures? A closure in a map
> is a lot like an object method, hmm?
>
> I found clojure components to be inspirational. But as light-weight as
> they are, components are still too heavy-weight to be objects. But a simple
> map seems ideal. And with only a map instead of a record or deftype,
> composition is simplicity itself. But the key idea here comes from clojure
> components: contents of the map should be configuration parameters or
> architecture, but not state. Put state in an atom and then (optionally) put
> the atom in the map. But once an object is formed, the contents of the map
> should not change. There should be no need to update a reference to this
> map.
>
> Below is what I am calling a Clojure Object. Like a Java object, the
> method holds both data and methods (closures). Note that, because we are
> using closures, local data can be accessed without having to be put in the
> map. For example, the file-channel variable is not accessed via the map and
> need not have been added to the map.
>
> Bill
>
> (ns aatree.db-file
>   (:require [clojure.tools.logging :as log])
>   (:import (java.nio.channels FileChannel)
>            (java.nio.file OpenOption StandardOpenOption)))
>
> (defn db-file-open
>   ([file opts]
>     (db-file-open (assoc opts :db-file file)))
>   ([opts]
>     (if (not (:db-file opts))
>       (throw (Exception. "missing :db-file option")))
>    (let [file (:db-file opts)
>          ^FileChannel file-channel
>          (FileChannel/open (.toPath file)
>                            (into-array OpenOption
>                                        [StandardOpenOption/CREATE
>                                         StandardOpenOption/READ
>                                         StandardOpenOption/WRITE]))
>          opts (assoc opts :db-file-channel file-channel)
>          opts (assoc opts
>                 :db-close
>                 (fn []
>                   (try
>                     (.close file-channel)
>                     (catch Exception e
>                       (log/warn e "exception on close of db-file")))
>                   (dissoc opts :db-file-channel)))
>          opts (assoc opts
>                 :db-file-empty?
>                 (fn []
>                   (= 0 (.size file-channel))))
>          opts (assoc opts
>                 :db-file-read
>                 (fn [byte-buffer position]
>                   (.read file-channel byte-buffer position)))
>          opts (assoc opts
>                 :db-file-write
>                 (fn [byte-buffer position]
>                   (.write file-channel byte-buffer position)))
>          opts (assoc opts
>                 :db-file-write-root
>                 (fn [byte-buffer position]
>                   (.force file-channel true)
>                   (.write file-channel byte-buffer position)
>                   (.force file-channel true)))
>          opts (assoc opts
>                 :db-file-force
>                 (fn []
>                   (.force file-channel true)))]
>      opts)))
>
> --
> 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
> Note that posts from new members are moderated - please be patient with
> your first post.
> 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
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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
Note that posts from new members are moderated - please be patient with your 
first post.
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to