I think s7's let is very similar to clojure's namespace.
(inlet 'x 1) creates a namespace with 'x bound
to 1, and (eval '(+ x 1) (inlet 'x 1)) is 2. Unless
otherwise specified, the "outlet" is the rootlet, so
to make an instance (so to speak) of the class
(inlet 'x 1), you could:

(let ((class (inlet 'x 1)))
  (let ((instance (inlet 'y 2)))
    (set! (outlet instance) class)
    (with-let instance
      (+ x y))))

(let ((instance (inlet 'floor (lambda (x) 3.14))))
  (with-let instance (floor 1.5)))

By using openlet, these lets can specialize built-in
functions (see mockery.scm) without having to change
to the instance namespace via with-let:

(let ((instance (inlet 'object->string (lambda (obj . rest) "hi"))))
  (openlet instance)
  (object->string instance))

The hierarchy is the outlet chain.  Locals can be added
with varlet, removed with cutlet, mapped over etc.
Another way to set up the chain is sublet:

(let ((class (inlet 'x 1)))
  (with-let (sublet class 'y 2) ; class=outlet + y=2 locally
    (+ x y)))

_______________________________________________
Cmdist mailing list
[email protected]
https://cm-mail.stanford.edu/mailman/listinfo/cmdist

Reply via email to