Sha256: c4eb251c503205cd9142e662696f61ef82a90863954591ca57e2caa709c2e6cd

Contents?: true

Size: 1.7 KB

Versions: 2

Compression:

Stored size: 1.7 KB

Contents

(defmacro defprotocol
  [name & doc+methods]
  (let [head (first doc-methods)
        doc (if (string? head) head)
        methods (if doc (rest doc+methods) doc+methods)
        signatures 



(defmacro deftype
  [id fields & opts+specs]
  (let [body (loop [body []
                    fields fields]
               (if (empty? fields)
                 (conj body 'this)
                 (recur (conj body
                              (list 'set! 
                                    (symbol (str "this." (name (first fields))))
                                    (first fields)))
                        (rest fields))))
        methods (loop [protocol nil 
                       forms opts+specs
                       defs []]
                  (let [form (first forms)]
                    (cond (empty? forms) defs
                          (symbol? form) (recur form (rest forms) defs)
                          (list? form) (if (nil? protocol)
                                         (throw (SyntaxError "Protocol missing"))
                                         (recur
                                          protocol
                                          (rest forms)
                                          (conj defs
                                                (list protocol 
                                                      id 
                                                      (cons 'fn form)))))
                          :else (recur protocol (rest forms) defs))))
        ]
    `(def ~id 
       (do
         (def ~id (fn ~id ~fields ~@body))
         ~@methods
         ~id))))

(defprotocol Colored
  (color [this]))

(deftype Apple [color]
  Colored
  (color [_] _))

(color (Apple. :red))

Version data entries

2 entries across 1 versions & 1 rubygems

Version Path
ruby-wisp-source-0.7.0 vendor/node_modules/wisp/src/type.wisp
ruby-wisp-source-0.7.0 vendor/try/node_modules/~wisp/src/type.wisp