Carp/examples/functor.carp

34 lines
883 B
Plaintext

(use IO)
(use Int)
(use Array)
(Project.no-echo)
(definterface fmap (λ [(λ [a] a) b] b))
(defmodule ArrayExtension
(defn fmap [f a] (Array.endo-map f a))
)
(deftype Box [x Int])
(defmodule Box
(defn fmap [f box] (let [new-x (f @(Box.x &box))]
(Box.set-x box new-x))))
(use Box)
(use ArrayExtension)
(defn higherOrder [x] (fmap Int.inc x))
(defn main []
(do
(println &(str @(Box.x &(fmap Int.inc (Box.init 100)))))
(println &(str @(Box.x &(Box.fmap inc (Box.init 100)))))
(println &(str &(ArrayExtension.fmap inc [10 20 30 40 50])))
(println &(str &(fmap Int.inc [10 20 30 40 50])))
(println &(Array.str &(fmap Int.inc [10 20 30 40 50])))
(println &(Array.str &(ArrayExtension.fmap Int.inc [10 20 30 40 50])))
(println &(str &(higherOrder (Box.init 999))))
(println &(str &(higherOrder [9 99 999 9999])))
))