-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclojure.core.fs
More file actions
136 lines (126 loc) · 5.35 KB
/
Copy pathclojure.core.fs
File metadata and controls
136 lines (126 loc) · 5.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
module clojure.core
open System
open Clojure.Read
let println (values: Value[]) =
let s = String.concat " " (Array.map string values)
Console.WriteLine(s)
Value.Null
let printfn (values: Value[]) =
Console.WriteLine(String.concat " " (Array.map (sprintf "%A") values))
type Op<'a, 'b> =
| Eq of ('a * 'b) * Return<bool>
and Return<'t> = 't -> ReturnValue
and ReturnValue = private { value: obj; typ: string } with
member this.Value = ()
static member Foo = ()
module Math =
let gt (values: Value[]) : Value =
// TODO GADT returns / ops in AST
match values.[0], values.[1] with
| Value.Number n, Value.Number n2 -> (n > n2)
| Value.Number n, Value.Float n2 -> (float n > n2)
| Value.Float n, Value.Number n2 -> (float n > float n2)
| Value.Float n, Value.Float n2 -> (n > n2)
| Value.String s, Value.String s2 -> (s > s2)
|> Value.Boolean
let lt (values: Value[]) : Value =
match values.[0], values.[1] with
| Value.Number n, Value.Number n2 -> (n < n2)
| Value.Number n, Value.Float n2 -> (float n < n2)
| Value.Float n, Value.Number n2 -> (float n < float n2)
| Value.Float n, Value.Float n2 -> (n < n2)
| Value.String s, Value.String s2 -> (s < s2)
|> Value.Boolean
let abs = CompiledFn <| fun (values: Value[]) ->
match values.[0] with
| Number n -> Number <| Math.Abs(n)
| Float f -> Float <| Math.Abs(f)
let _mod (values: Value[]) : Value =
match values.[0], values.[1] with
| Value.Number n, Value.Number n2 -> n % n2 |> Number
| Value.Number n, Value.Float n2 -> float n % n2 |> Float
| Value.Float n, Value.Number n2 -> n % float n2 |> Float
| Value.Float n, Value.Float n2 -> float n % n2 |> Float
let subtract (values: Value[]) : Value =
if values.Length = 1 then
match values.[0] with
| Value.Number i -> Value.Number <| i * -1L
| Value.Float f -> Value.Float <| f * -1.0
else
let mutable n_int = 0L
let mutable n = 0.0
let mutable isFloat = false
match values.[0] with
| Value.Number i -> n_int <- i
| Value.Float f ->
isFloat <- true
n <- f
for value in (values |> Array.skip 1) do
match value with
| Value.Number i -> if isFloat then n <- n - double i else n_int <- n_int - i
| Value.Float f ->
if not isFloat then
isFloat <- true
n <- double n_int
n <- n - f
| _ -> failwithf "Can't subtract value %A\n%A" value Environment.StackTrace
if isFloat then Value.Float n else Value.Number n_int
let mult (values: Value[]) : Value =
let mutable n_int = 1L
let mutable n = 1.0
let mutable isFloat = false
if values.Length = 1 then
match values.[0] with
| Value.Number i -> Value.Number <| i * n_int
| Value.Float f -> Value.Float <| f * n
else
match values.[0] with
| Value.Number i -> n_int <- i
| Value.Float f ->
isFloat <- true
n <- f
for value in (values |> Array.skip 1) do
match value with
| Value.Number i -> if isFloat then n <- n * double i else n_int <- n_int * i
| Value.Float f ->
if not isFloat then
isFloat <- true
n <- double n_int
n <- n * f
| _ -> failwithf "Can't subtract value %A\n%A" value Environment.StackTrace
if isFloat then Value.Float n else Value.Number n_int
// let division (values: Value[]) : Value =
// let mutable n_int = 1L
// let mutable n = 1.0
// let mutable isFloat = false
// if values.Length = 1 then
// match values[0] with
// | Value.Number i -> Value.Number <| n_int / i
// | Value.Float f -> Value.Float <| n / f
// else
// match values[0] with
// | Value.Number i -> n_int <- i
// | Value.Float f ->
// isFloat <- true
// n <- f
// for value in (values |> Array.skip 1) do
// match value with
// | Value.Number i -> if isFloat then n <- n / double i else n_int <- n_int / i
// | Value.Float f ->
// if not isFloat then
// isFloat <- true
// n <- double n_int
// n <- n / f
// | _ -> failwithf "Can't divide value %A\n%A" value Environment.StackTrace
// if isFloat then Value.Float n else Value.Number n_int
let division (values: Value[]) : Value =
let mutable n = 0.0
match values.[0] with
| Value.Number i -> n <- float i
| Value.Float f -> n <- f
for value in (values |> Array.skip 1) do
match value with
| Value.Number i -> n <- n / float i
| Value.Float f -> n <- n / f
| _ -> failwithf "Can't divide value %A\n%A" value Environment.StackTrace
Float n