diff --git a/core/Array.carp b/core/Array.carp index a18e8853..a952dd71 100644 --- a/core/Array.carp +++ b/core/Array.carp @@ -105,6 +105,7 @@ Returns `Nothing` if the array is empty.") (set! eq false) (break)))) eq))) + (implements = Array.=) (doc maximum "gets the maximum in an array (elements must support `<`) and wraps it in a `Just`. @@ -144,6 +145,7 @@ If the array is empty, returns `Nothing`") (for [i start-index end-index] (set! result (push-back result @(unsafe-nth xs i)))) result)) + (implements slice Array.slice) (doc prefix "gets a prefix array to `end-index`.") (defn prefix [xs end-index] diff --git a/core/Bool.carp b/core/Bool.carp index dbaed50b..edb64ad3 100644 --- a/core/Bool.carp +++ b/core/Bool.carp @@ -13,6 +13,8 @@ (defmodule RefBool (defn = [a b] - (Bool.= @a @b))) + (Bool.= @a @b)) + (implements = RefBool.=) + ) (defn not [a] (Bool.not a)) diff --git a/core/Char.carp b/core/Char.carp index 73150cfb..bc514cc0 100644 --- a/core/Char.carp +++ b/core/Char.carp @@ -58,11 +58,15 @@ (defmodule CharRef (defn = [a b] (Char.= @a @b)) + (implements = CharRef.=) (defn < [a b] (Char.< @a @b)) + (implements < CharRef.<) (defn > [a b] (Char.> @a @b)) + (implements > CharRef.>) ) (defmodule PtrChar - (register str (Fn [(Ptr Char)] String))) + (register str (Fn [(Ptr Char)] String)) + (implements str PtrChar.str)) diff --git a/core/Collection.carp b/core/Collection.carp index be4b0038..aff8abd1 100644 --- a/core/Collection.carp +++ b/core/Collection.carp @@ -1,5 +1,9 @@ (definterface unsafe-nth (Fn [(Ref (a b) c) Int] &b)) +(implements unsafe-nth Array.unsafe-nth) +(implements unsafe-nth StaticArray.unsafe-nth) (definterface length (Fn [(Ref (a b))] Int)) +(implements unsafe-nth Array.length) +(implements unsafe-nth StaticArray.length) (defmodule Collections (defn empty? [a] diff --git a/core/Color.carp b/core/Color.carp index 5cbe6823..50d3b247 100644 --- a/core/Color.carp +++ b/core/Color.carp @@ -27,8 +27,10 @@ (use Id) (defn hash [k] (get-tag k)) + (implements hash Color.hash) (defn = [a b] (= (hash (the (Ref Id) a)) (hash b))) + (implements = Color.=) (def table {(Black) @"30" diff --git a/core/Double.carp b/core/Double.carp index 3abd2ad0..0711ed44 100644 --- a/core/Double.carp +++ b/core/Double.carp @@ -68,7 +68,8 @@ (implements floor Double.floor) (implements frexp Double.frexp) (implements ldexp Double.ldexp) - (implements log Double.log10) + (implements log Double.log) + (implements log10 Double.log10) (implements mod Double.mod) (implements modf Double.modf) (implements pow Double.pow) @@ -95,7 +96,7 @@ The margin of error is `0.00001`.") (defn dec [x] (- x 1.0)) - (implements inc Double.dec) + (implements dec Double.dec) (defn add-ref [x y] (Double.+ @x @y)) @@ -105,10 +106,13 @@ The margin of error is `0.00001`.") (defmodule DoubleRef (defn = [a b] (Double.= @a @b)) + (implements = DoubleRef.=) (defn < [a b] (Double.< @a @b)) + (implements < DoubleRef.<) (defn > [a b] (Double.> @a @b)) + (implements > DoubleRef.>) ) diff --git a/core/Float.carp b/core/Float.carp index 16ef1851..c4527e83 100644 --- a/core/Float.carp +++ b/core/Float.carp @@ -79,7 +79,8 @@ The margin of error is 0.00001.") (implements floor Float.floor) (implements frexp Float.frexp) (implements ldexp Float.ldexp) - (implements log Float.log10) + (implements log Float.log) + (implements log10 Float.log10) (implements mod Float.mod) (implements modf Float.modf) (implements pow Float.pow) diff --git a/core/Int.carp b/core/Int.carp index 1db8607c..7859f637 100644 --- a/core/Int.carp +++ b/core/Int.carp @@ -95,10 +95,13 @@ (defmodule IntRef (defn = [a b] (Int.= @a @b)) + (implements = IntRef.=) (defn < [a b] (Int.< @a @b)) + (implements < IntRef.<) (defn > [a b] (Int.> @a @b)) + (implements > IntRef.>) ) diff --git a/core/Map.carp b/core/Map.carp index 730e19b4..7f879e57 100644 --- a/core/Map.carp +++ b/core/Map.carp @@ -11,66 +11,82 @@ (set! a (* a b)) (set! x (Int.inc x)))) (Int.abs vh))) + (implements hash String.hash) ) (defmodule Int (defn hash [k] (the Int @k)) + (implements hash Int.hash) ) (defmodule Long (defn hash [k] (to-int (the Long @k))) + (implements hash Long.hash) ) (defmodule Bool (defn hash [k] (if (the Bool @k) 1 0)) + (implements hash Bool.hash) ) (defmodule Char (defn hash [k] (to-int (the Char @k))) + (implements hash Char.hash) ) (defmodule Byte (defn hash [k] (to-int (the Byte @k))) + (implements hash Byte.hash) ) (defmodule Float (defn hash [k] (Float.to-bytes @k)) + (implements hash Float.hash) ) (defmodule Double (defn hash [k] (Long.to-int (Double.to-bytes @k))) + (implements hash Double.hash) ) (defmodule Int8 (defn hash [k] (Long.to-int (Int8.to-long @k))) + (implements hash Int8.hash) ) (defmodule Int16 (defn hash [k] (Long.to-int (Int16.to-long @k))) + (implements hash Int16.hash) ) (defmodule Int32 (defn hash [k] (Long.to-int (Int32.to-long @k))) + (implements hash Int32.hash) ) (defmodule Int64 (defn hash [k] (Long.to-int (Int64.to-long @k))) + (implements hash Int64.hash) ) (defmodule Uint8 (defn hash [k] (Long.to-int (Uint8.to-long @k))) + (implements hash Uint8.hash) ) (defmodule Uint16 (defn hash [k] (Long.to-int (Uint16.to-long @k))) + (implements hash Uint16.hash) ) (defmodule Uint32 (defn hash [k] (Long.to-int (Uint32.to-long @k))) + (implements hash Uint32.hash) ) (defmodule Uint64 (defn hash [k] (Long.to-int (Uint64.to-long @k))) + (implements hash Uint64.hash) ) (defmodule Pair @@ -79,6 +95,7 @@ (set! code (+ (* 31 code) (hash (Pair.a pair)))) (set! code (+ (* 31 code) (hash (Pair.b pair)))) code)) + (implements hash Pair.hash) ) (deftype (Bucket a b) [entries (Array (Pair a b))]) @@ -261,6 +278,7 @@ (and (= (length m1) (length m2)) ;; we could use contains? and get-with-default here to avoid requiring a (zero) for the value type (all? &(fn [k v] (= v &(get m2 k))) m1))) + (implements = Map.=) (doc for-each "Execute the binary function f for all keys and values in the map m.") (defn for-each [m f] @@ -449,6 +467,7 @@ (defn = [set-a set-b] (and (= (Set.length set-a) (Set.length set-b)) (subset? set-a set-b))) + (implements = Set.=) (doc for-each "Execute the unary function f for each element in the set s.") (defn for-each [s f] @@ -507,4 +526,5 @@ @"{" set)] (String.append &res " }"))) + (implements str Set.str) ) diff --git a/core/Maybe.carp b/core/Maybe.carp index 231d0631..1431bfae 100644 --- a/core/Maybe.carp +++ b/core/Maybe.carp @@ -51,6 +51,7 @@ It is the inverse of [`just?`](#just?).") (match-ref b (Nothing) false (Just y) (= x y)))) + (implements = Maybe.=) (doc unsafe-ptr "Creates a `(Ptr a)` from a `(Maybe a)`. If the `Maybe` was `Nothing`, this function will return a `NULL` value.") @@ -69,4 +70,5 @@ It is the inverse of [`just?`](#just?).") (doc zero "returns `Nothing`.") (defn zero [] (Nothing)) + (implements zero Maybe.zero) ) diff --git a/core/Pattern.carp b/core/Pattern.carp index ac2406df..6a849b87 100644 --- a/core/Pattern.carp +++ b/core/Pattern.carp @@ -29,12 +29,16 @@ If you want to replace all occurrences of the pattern, use `-1`.") (defn matches? [pat s] (/= (find pat s) -1)) (register str (Fn [&Pattern] String)) + (implements str Pattern.str) (register prn (Fn [&Pattern] String)) + (implements prn Pattern.prn) (register init (Fn [&String] Pattern)) (register = (Fn [&Pattern &Pattern] Bool)) + (implements = Pattern.=) (register delete (Fn [Pattern] ())) (register copy (Fn [&Pattern] Pattern)) + (implements copy Pattern.copy) (doc from-chars "creates a pattern that matches a group of characters from a list of those characters.") (defn from-chars [chars] diff --git a/core/Pointer.carp b/core/Pointer.carp index e175ba03..30e93032 100644 --- a/core/Pointer.carp +++ b/core/Pointer.carp @@ -1,4 +1,6 @@ (defmodule Pointer (defn inc [a] (Pointer.add a 1l)) + (implements inc Pointer.inc) (defn dec [a] (Pointer.sub a 1l)) + (implements dec Pointer.dec) ) diff --git a/core/Result.carp b/core/Result.carp index f9b69c8e..41fec174 100644 --- a/core/Result.carp +++ b/core/Result.carp @@ -106,6 +106,7 @@ It is the inverse of [`success?`](#success?).") (match-ref b (Success _) false (Error y) (= x y)))) + (implements = Result.=) ) (defmodule Maybe diff --git a/core/StdInt.carp b/core/StdInt.carp index b2de6c73..3dfe354b 100644 --- a/core/StdInt.carp +++ b/core/StdInt.carp @@ -50,6 +50,9 @@ (defn prn [a] (Int8.prn @a)) (defn str [a] (Int8.str @a)) (defn = [a b] (Int8.= @a @b)) + (implements prn Int8Extra.prn) + (implements str Int8Extra.str) + (implements = Int8Extra.=) ) (defmodule Int16 @@ -93,6 +96,9 @@ (defn prn [a] (Int16.prn @a)) (defn str [a] (Int16.str @a)) (defn = [a b] (Int16.= @a @b)) + (implements prn Int16Extra.prn) + (implements str Int16Extra.str) + (implements = Int16Extra.=) ) (defmodule Int32 @@ -136,6 +142,9 @@ (defn prn [a] (Int32.prn @a)) (defn str [a] (Int32.str @a)) (defn = [a b] (Int32.= @a @b)) + (implements prn Int32Extra.prn) + (implements str Int32Extra.str) + (implements = Int32Extra.=) ) (defmodule Int64 @@ -179,6 +188,9 @@ (defn prn [a] (Int64.prn @a)) (defn str [a] (Int64.str @a)) (defn = [a b] (Int64.= @a @b)) + (implements prn Int64Extra.prn) + (implements str Int64Extra.str) + (implements = Int64Extra.=) ) (defmodule Uint8 @@ -222,6 +234,9 @@ (defn prn [a] (Uint8.prn @a)) (defn str [a] (Uint8.str @a)) (defn = [a b] (Uint8.= @a @b)) + (implements prn Uint8Extra.prn) + (implements str Uint8Extra.str) + (implements = Uint8Extra.=) ) (defmodule Uint16 @@ -265,6 +280,9 @@ (defn prn [a] (Uint16.prn @a)) (defn str [a] (Uint16.str @a)) (defn = [a b] (Uint16.= @a @b)) + (implements prn Uint16Extra.prn) + (implements str Uint16Extra.str) + (implements = Uint16Extra.=) ) (defmodule Uint32 @@ -308,6 +326,9 @@ (defn prn [a] (Uint32.prn @a)) (defn str [a] (Uint32.str @a)) (defn = [a b] (Uint32.= @a @b)) + (implements prn Uint32Extra.prn) + (implements str Uint32Extra.str) + (implements = Uint32Extra.=) ) (defmodule Uint64 @@ -351,4 +372,7 @@ (defn prn [a] (Uint64.prn @a)) (defn str [a] (Uint64.str @a)) (defn = [a b] (Uint64.= @a @b)) + (implements prn Uint64Extra.prn) + (implements str Uint64Extra.str) + (implements = Uint64Extra.=) ) diff --git a/core/String.carp b/core/String.carp index 098b8f98..17b89c48 100644 --- a/core/String.carp +++ b/core/String.carp @@ -20,6 +20,7 @@ (register from-chars (Fn [&(Array Char)] String)) (register tail (λ [(Ref String)] String)) (register format (Fn [&String &String] String)) + (implements format String.format) (register string-set! (Fn [&String Int Char] ())) (register string-set-at! (Fn [&String Int &String] ())) (register allocate (Fn [Int Char] String)) @@ -171,14 +172,15 @@ (defn < [a b] (String.< &a &b)) - (implements = StringCopy.<) + (implements < StringCopy.<) (defn > [a b] (String.> &a &b)) - (implements = StringCopy.>) + (implements > StringCopy.>) (defn prn [s] (prn &(the String s))) + (implements prn StringCopy.prn) (defn str [s] (str &(the String s))) @@ -187,12 +189,14 @@ (defmodule Bool (register str (Fn [Bool] String)) + (implements str Bool.str) (register format (Fn [&String Bool] String)) (implements format Bool.format) ) (defmodule Int (register str (Fn [Int] String)) + (implements str Int.str) (register format (Fn [&String Int] String)) (implements format Int.format) (register from-string (λ [&String] Int)) @@ -201,6 +205,7 @@ (defmodule Byte (register str (Fn [Byte] String)) + (implements str Byte.str) (register format (Fn [&String Byte] String)) (implements format Byte.format) (register from-string (λ [&String] Byte)) @@ -209,6 +214,7 @@ (defmodule Float (register str (Fn [Float] String)) + (implements str Float.str) (register format (Fn [&String Float] String)) (implements format Float.format) (register from-string (λ [&String] Float)) @@ -217,6 +223,7 @@ (defmodule Long (register str (Fn [Long] String)) + (implements str Long.str) (register format (Fn [&String Long] String)) (implements format Long.format) (register from-string (λ [&String] Long)) @@ -225,6 +232,7 @@ (defmodule Double (register str (Fn [Double] String)) + (implements str Double.str) (register format (Fn [&String Double] String)) (implements format Double.format) (register from-string (λ [&String] Double)) @@ -233,6 +241,7 @@ (defmodule Char (register str (Fn [Char] String)) + (implements str Char.str) (register prn (Fn [Char] String)) (implements prn Char.prn) (register format (Fn [&String Char] String)) @@ -245,17 +254,21 @@ (defn prn [x] (Int.str @x)) (implements prn IntRef.prn) (defn str [x] (Int.str @x)) + (implements str IntRef.str) ) (defmodule BoolRef (defn prn [x] (Bool.str @x)) (implements prn BoolRef.prn) - (defn str [x] (Bool.str @x))) + (defn str [x] (Bool.str @x)) + (implements str BoolRef.str) + ) (defmodule ByteRef (defn prn [x] (Byte.str @x)) (implements prn ByteRef.prn) (defn str [x] (Byte.str @x)) + (implements str ByteRef.str) ) (defmodule Long (defn prn [x] (Long.str x)) (implements prn Long.prn)) diff --git a/core/Tuples.carp b/core/Tuples.carp index cd6fd832..738665ca 100644 --- a/core/Tuples.carp +++ b/core/Tuples.carp @@ -4,14 +4,17 @@ (defn = [p1 p2] (and (= (Pair.a p1) (Pair.a p2)) (= (Pair.b p1) (Pair.b p2)))) + (implements = PairRef.=) (defn < [p1 p2] (if (= (Pair.a p1) (Pair.a p2)) (< (Pair.b p1) (Pair.b p2)) (< (Pair.a p1) (Pair.a p2)))) + (implements < PairRef.<) (defn > [p1 p2] (PairRef.< p2 p1))) + (implements > PairRef.=) (defmodule Pair (defn init-from-refs [r1 r2] @@ -20,12 +23,15 @@ (defn = [p1 p2] (and (= (Pair.a &p1) (Pair.a &p2)) (= (Pair.b &p1) (Pair.b &p2)))) + (implements = Pair.=) (defn < [p1 p2] (PairRef.< &p1 &p2)) + (implements < Pair.<) (defn > [p1 p2] (PairRef.> &p1 &p2)) + (implements > Pair.>) (doc reverse "reverses a `Pair` `p` such that its first member is its second member and vice versa.") (defn reverse [p] diff --git a/examples/functor.carp b/examples/functor.carp index 56052b58..68c904a2 100644 --- a/examples/functor.carp +++ b/examples/functor.carp @@ -7,13 +7,15 @@ (defmodule ArrayExtension (defn fmap [f a] (Array.endo-map f a)) + (implements fmap ArrayExtension.fmap) ) (deftype Box [x Int]) (defmodule Box (defn fmap [f box] (let [new-x (~f @(Box.x &box))] - (Box.set-x box new-x)))) + (Box.set-x box new-x))) + (implements fmap Box.fmap)) (use Box) (use ArrayExtension) diff --git a/examples/sorting.carp b/examples/sorting.carp index 24451b06..16f07c37 100644 --- a/examples/sorting.carp +++ b/examples/sorting.carp @@ -9,7 +9,12 @@ (defn > [a b] (> (Age.x a) (Age.x b))) (defn < [a b] - (< (Age.x a) (Age.x b)))) + (< (Age.x a) (Age.x b))) + + (implements = Age.=) + (implements > Age.>) + (implements < Age.<) + ) (defn main [] (let-do [ints (Array.sort [10 3 75 40]) diff --git a/test/memory.carp b/test/memory.carp index 6a33950b..4733ef89 100644 --- a/test/memory.carp +++ b/test/memory.carp @@ -291,9 +291,11 @@ (defn < [a b] (< (Array.length a) (Array.length b))) + (implements < ArrayCompareExtension.<) (defn > [a b] (> (Array.length a) (Array.length b)))) + (implements > ArrayCompareExtension.>) (defn array-sort-1 [] (let [xs [[0 0] [0 0 0] [0 0 0 0] [0]] ys (Array.sort xs)] diff --git a/test/nested.carp b/test/nested.carp index dc5a9b78..1f042cf5 100644 --- a/test/nested.carp +++ b/test/nested.carp @@ -15,11 +15,13 @@ ;; A function with correct nr of args but just generic types used to really confuse the type checker: (defmodule Confuse (defn = [a b] - true)) + true) + (implements = Confuse.=)) (defmodule Young (defn = [y1 y2] - (Int.= @(age y1) @(age y2)))) + (Int.= @(age y1) @(age y2))) + (implements = Young.=)) ;; Now I want to use 'Young.=' in with 'Ur.compare' (defn f []