Hi all,
I have some code in Scheme that I'm converting over to Clojure. It frequently
uses a dispatching pattern that's very similar to multimethods, but with an
inverted approach to the matching predicates. For example, there a generic
function "assign-operations". The precise implementation details aren't too
important at the moment, but notice that it can take a list of
argument-predicates.
(define (assign-operation operator handler . argument-predicates)
(let ((record
(let ((record (get-operator-record operator))
(arity (length argument-predicates)))
(if record
(begin
(if (not (fix:= arity (operator-record-arity record)))
(error "Incorrect operator arity:" operator))
record)
(let ((record (make-operator-record arity)))
(hash-table/put! *generic-operator-table* operator record)
record)))))
(set-operator-record-tree! record
(bind-in-tree argument-predicates
handler
(operator-record-tree record))))
The dispatched functions supply these predicates, one per argument in the arity
of the function.
(assign-operation 'merge
(lambda (content increment) content)
any? nothing?)
(assign-operation 'merge
(lambda (content increment) increment)
nothing? any?)
(assign-operation 'merge
(lambda (content increment)
(let ((new-range (intersect-intervals content increment)))
(cond ((interval-equal? new-range content) content)
((interval-equal? new-range increment) increment)
((empty-interval? new-range) the-contradiction)
(else new-range))))
interval? interval?)
I can certainly just transliterate this, but would like to make a more
idiomatic conversion. What would be an equivalent construct in Clojure? This
feels like a place for a clever application of multimethods, protocols, or
types, but the dispatch model seems backwards from multimethods.
Cheers,
-Michael
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en