aboutsummaryrefslogtreecommitdiff
path: root/core/math.nom
blob: d8952f69c015a2a0009d43179e7c5e90ad5189d0 (plain)
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
#!/usr/bin/env nomsu -V2.3.4.3
#
    This file defines some common math literals and functions

use "core/metaprogramming.nom"
use "core/text.nom"
use "core/operators.nom"
use "core/control_flow.nom"
use "core/collections.nom"

# Literals:
compile [infinity, inf] to (Lua value "math.huge")
compile [not a number, NaN, nan] to (Lua value "(0/0)")
compile [pi, Pi, PI] to (Lua value "math.pi")
compile [tau, Tau, TAU] to (Lua value "(2*math.pi)")
compile [golden ratio] to (Lua value "((1+math.sqrt(5))/2)")
compile [e] to (Lua value "math.exp(1)")

# Functions:
compile [% as a number, % as number] to (Lua value "tonumber(\(% as lua expr))")
compile [absolute value %, | % |, abs %] to (..)
    Lua value "math.abs(\(% as lua expr))"

compile [square root %, square root of %, √ %, sqrt %] to (..)
    Lua value "math.sqrt(\(% as lua expr))"

compile [sine %, sin %] to (Lua value "math.sin(\(% as lua expr))")
compile [cosine %, cos %] to (Lua value "math.cos(\(% as lua expr))")
compile [tangent %, tan %] to (Lua value "math.tan(\(% as lua expr))")
compile [arc sine %, asin %] to (Lua value "math.asin(\(% as lua expr))")
compile [arc cosine %, acos %] to (Lua value "math.acos(\(% as lua expr))")
compile [arc tangent %, atan %] to (Lua value "math.atan(\(% as lua expr))")
compile [arc tangent %y / %x, atan2 %y %x] to (..)
    Lua value "math.atan2(\(%y as lua expr), \(%x as lua expr))"

compile [hyperbolic sine %, sinh %] to (Lua value "math.sinh(\(% as lua expr))")
compile [hyperbolic cosine %, cosh %] to (..)
    Lua value "math.cosh(\(% as lua expr))"

compile [hyperbolic tangent %, tanh %] to (..)
    Lua value "math.tanh(\(% as lua expr))"

compile [e^ %, exp %] to (Lua value "math.exp(\(% as lua expr))")
compile [natural log %, ln %, log %] to (Lua value "math.log(\(% as lua expr))")
compile [log % base %base, log base %base of %] to (..)
    Lua value "math.log(\(% as lua expr), \(%base as lua expr))"

compile [floor %] to (Lua value "math.floor(\(% as lua expr))")
compile [ceiling %, ceil %] to (Lua value "math.ceil(\(% as lua expr))")
compile [round %, % rounded] to (Lua value "math.floor(\(% as lua expr) + .5)")
action [%n to the nearest %rounder] (..)
    =lua "(\%rounder)*math.floor((\%n / \%rounder) + .5)"


# Any/all/none
compile [all of %items, all %items] to:
    unless (%items.type is "List"):
        return (Lua value "utils.all(\(%items as lua expr))")
    
    %clauses = ((% as lua expr) for % in %items)
    return (Lua value "(\(%clauses joined with " and "))")

parse [not all of %items, not all %items] as (not (all of %items))
compile [any of %items, any %items] to:
    unless (%items.type is "List"):
        return (Lua value "utils.any(\(%items as lua expr))")
    
    %clauses = ((% as lua expr) for % in %items)
    return (Lua value "(\(%clauses joined with " or "))")

parse [none of %items, none %items] as (not (any of %items))
compile [sum of %items, sum %items] to:
    unless (%items.type is "List"):
        return (Lua value "utils.sum(\(%items as lua expr))")
    
    %clauses = ((% as lua expr) for % in %items)
    return (Lua value "(\(%clauses joined with " + "))")

compile [product of %items, product %items] to:
    unless (%items.type is "List"):
        return (Lua value "utils.product(\(%items as lua expr))")
    
    %clauses = ((% as lua expr) for % in %items)
    return (Lua value "(\(%clauses joined with " * "))")

action [avg of %items, average of %items] (=lua "(utils.sum(\%items)/#\%items)")
compile [min of %items, smallest of %items, lowest of %items] to (..)
    Lua value "utils.min(\(%items as lua expr))"

compile [max of %items, biggest of %items, largest of %items, highest of %items]
..to (Lua value "utils.max(\(%items as lua expr))")

parse [min of %items by %item = %value_expr] as (..)
    result of:
        set {%best: nil, %best_key: nil}
        for %item in %items:
            %key = %value_expr
            if ((%best == (nil)) or (%key < %best_key)):
                set {%best: %item, %best_key: %key}
        
        return %best

parse [max of %items by %item = %value_expr] as (..)
    result of:
        set {%best: nil, %best_key: nil}
        for %item in %items:
            %key = %value_expr
            if ((%best == (nil)) or (%key > %best_key)):
                set {%best: %item, %best_key: %key}
        
        return %best


# Random functions
action [seed random with %] (..)
    lua> "math.randomseed(\%);\nfor i=1,20 do math.random(); end"

parse [seed random] as (seed random with (=lua "os.time()"))
compile [random number, random, rand] to (Lua value "math.random()")
compile [random int %n, random integer %n, randint %n] to (..)
    Lua value "math.random(\(%n as lua expr))"

compile [random from %low to %high, random number from %low to %high, rand %low %high]
..to (Lua value "math.random(\(%low as lua expr), \(%high as lua expr))")

action [random choice from %elements, random choice %elements, random %elements]
..(=lua "\%elements[math.random(#\%elements)]")