Adds bitwise operations

This commit is contained in:
sloum 2022-07-05 15:59:59 -07:00
parent dd6d87cc83
commit 5e151ceda9
3 changed files with 85 additions and 2 deletions

View File

@ -203,7 +203,7 @@ Quote and list both have some syntactic sugar to create a shorthand for their us
Implemented:
`positive?`, `negative?`, `zero?`, `abs`, `floor`, `ceil`, `round`, `+`, `-`, `*`, `/`, `min`, `max`, `number->string`, `rune->string`, `rand`, `rand-seed`, `%`, `exp`, `cos`, `sin`, `tan`, `sqrt`, `atan`, `sqrt`
`positive?`, `negative?`, `zero?`, `abs`, `floor`, `ceil`, `round`, `+`, `-`, `*`, `/`, `min`, `max`, `number->string`, `rune->string`, `rand`, `rand-seed`, `%`, `exp`, `cos`, `sin`, `tan`, `sqrt`, `atan`, `sqrt`, `&`, `|`, `^`, `>>`, `<<`
<details>
@ -228,6 +228,11 @@ Implemented:
<li><code>(- [number...])</code>: <code>number</code></li>
<li><code>(* [number...])</code>: <code>number</code></li>
<li><code>(/ [number...])</code>: <code>number</code></li>
<li><code>(& [number] [number])</code>: <code>number</code></li>
<li><code>(| [number] [number])</code>: <code>number</code></li>
<li><code>(^ [number] [[number]])</code>: <code>number</code></li>
<li><code>(<< [number] [number])</code>: <code>number</code></li>
<li><code>(>> [number] [number])</code>: <code>number</code></li>
<li><code>(exp [number] [number])</code>: <code>number</code></li>
<li><code>(min [number...])</code>: <code>number</code></li>
<li><code>(max [number...])</code>: <code>number</code></li>

73
lib.go
View File

@ -224,6 +224,79 @@ var stdLibrary = vars{
}
return number(math.Round(float64(num)*math.Pow(10, float64(decimals))) / math.Pow(10, float64(decimals)))
},
"&": func(a ...expression) expression {
if len(a) < 2 {
return exception("'&' expected two numbers, insufficient arguments were given")
}
n1, ok := a[0].(number)
if !ok {
return exception("'&' expected argument one to be a number, a non-number value was given")
}
n2, ok2 := a[1].(number)
if !ok2 {
return exception("'&' expected argument two to be a number, a non-number value was given")
}
return number(int(n1) & int(n2))
},
"|": func(a ...expression) expression {
if len(a) < 2 {
return exception("'|' expected two numbers, insufficient arguments were given")
}
n1, ok := a[0].(number)
if !ok {
return exception("'|' expected argument one to be a number, a non-number value was given")
}
n2, ok2 := a[1].(number)
if !ok2 {
return exception("'|' expected argument two to be a number, a non-number value was given")
}
return number(int(n1) | int(n2))
},
"<<": func(a ...expression) expression {
if len(a) < 2 {
return exception("'<<' expected two numbers, insufficient arguments were given")
}
n1, ok := a[0].(number)
if !ok {
return exception("'<<' expected argument one to be a number, a non-number value was given")
}
n2, ok2 := a[1].(number)
if !ok2 {
return exception("'<<' expected argument two to be a number, a non-number value was given")
}
return number(int(n1) << int(n2))
},
">>": func(a ...expression) expression {
if len(a) < 2 {
return exception("'>>' expected two numbers, insufficient arguments were given")
}
n1, ok := a[0].(number)
if !ok {
return exception("'>>' expected argument one to be a number, a non-number value was given")
}
n2, ok2 := a[1].(number)
if !ok2 {
return exception("'>>' expected argument two to be a number, a non-number value was given")
}
return number(int(n1) >> int(n2))
},
"^": func(a ...expression) expression {
if len(a) < 2 {
return exception("'^' expected two numbers, insufficient arguments were given")
}
n1, ok := a[0].(number)
if !ok {
return exception("'^' expected argument one to be a number, a non-number value was given")
}
if len(a) == 1 {
return number(^int(n1))
}
n2, ok2 := a[1].(number)
if !ok2 {
return exception("'^' expected argument two to be a number, a non-number value was given")
}
return number(int(n1) ^ int(n2))
},
"+": func(a ...expression) expression {
if len(a) == 0 {
return number(0)

View File

@ -20,7 +20,12 @@ var usageStrings = map[string]string{
"*": "(* [number...]) => number\n\nMultiplys the given numbers and returns the result, If only one number is provided then 1 is divided by it and the result is returned",
"/": "(/ [number...]) => number\n\nDivides the given numbers, left to right, and returns the result. If only one number is provided it is simply returned",
"%": "(% [number] [number]) => number\n\nReturns the modulus of two numbers",
"sqrt": "(% [number]) => number\n\nReturns the square root of the given number",
"&": "(& [number] [number]) => number\n\nReturns the bitwise AND of two numbers",
"|": "(| [number] [number]) => number\n\nReturns the bitwise OR of two numbers",
"^": "(^ [number] [[number]]) => number\n\nReturns the bitwise XOR of two numbers, or the bitwise NOT of a single number",
"<<": "(<< [number] [number]) => number\n\nBit shifts the first number left by the second number",
">>": "(>> [number] [number]) => number\n\nBit shifts the first number right by the second number",
"sqrt": "(sqrt [number]) => number\n\nReturns the square root of the given number",
"atan": "(atan [number] [[number]]) => number\n\nIf one number is given returns the atan of that number, if two numbers are given returns the atan2 of the two given numbers",
"tan": "(tan [number] [[number]]) => number\n\nReturns the tan of the given number",
"log": "(log [number]) => number\n\nReturns the natural log of the given number",