Awesome
RustScript
RustScript is a scripting language as much relation to Rust as JavaScript has to Java
See a more complete version of this project at https://github.com/WilliamRagstad/RustScript
See an even better version at https://github.com/mkhan45/RustScript2
I made this for a school project; it's meant to be implemented into a messaging app as a chat bot so everything should be a one liner.
Usage
This is an expression based language; everything is an expression. There are global variables though.
The following examples are created using the repl.
Basic Arithmetic
> 4 * -3 + 12 - -3 + 4 * 15
63
Variables
> let x = 5
> x * 15
75
Lists
> let ls = [1, 2, 9, 4, 5]
> ls
[1, 2, 9, 4, 5]
> let ls = ls + [2, 4, 6, 8]
> ls
[1, 2, 9, 4, 5, 2, 4, 6, 8]
> ^ls
1
> $ls
[2, 9, 4, 5, 2, 4, 6, 8]
Ranges
> [5..12]
[5, 6, 7, 8, 9, 10, 11]
List Comprehensions
> [x * x for x in [0..15]]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196]
Lambdas
> let f = fn (x) => x * 2
> f(30)
60
> let apply_twice = fn (f, x) => f(f(x))
> apply_twice(f, 5)
20
Conditionals
> if (3 < 5) then (4) else (3)
4
> [if (x % 3 == 0) then (x / 3) else (x * 2) for x in [0..10]]
[0, 2, 4, 1, 8, 10, 2, 14, 16, 3]
> let fib = fn (n) => if (n < 2) then (1) else (fib(n - 1) + fib(n - 2))
> fib(15)
987
Small Standard Library
> range(3, 5)
[3, 4]
> fmap(fib, [5..10] + [3, 2])
[8, 13, 21, 34, 55, 3, 2]
> filter(fn (n) => n % 3 == 0, [0..20])
[0, 3, 6, 9, 12, 15, 18]
> fold(fn (a, b) => a + b, 0, [0..20])
190
> sum([0..20])
190
> product([1..10])
362880
Project Euler
A few project euler problems
Problem 1
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000.
> sum([x for x in [0..1000] if x % 3 == 0 || x % 5 == 0])
233168
Problem 2
Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.
> let fib = fn (n) => ^$fold(fn (ls, i) => [^$ls, ^ls + ^$ls], [1, 1], [0..n])
> let fibs = [fib(n) for n in [1..35]]
> sum([f for f in fibs if f < 4000000 && f % 2 == 0])
4613732
Problem 3
The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143 ?
let find = fn (f, ls) => if (ls) then (if (f(^ls)) then (^ls) else (find(f, $ls))) else (false)
let factor = fn (n) => find(fn (i) => n % i == 0, [2..n / 2])
600851475143 is larger than int
allows so I'd have to make it support longs to do this one.
It's worth noting that factor
doubles as is_prime
, since it returns false for prime numbers.
Problem 5
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder. What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
> let gcd = fn (a, b) => if (b == 0) then (a) else (gcd(b, (a % b)))
> let lcm = fn (a, b) => (a * b) / (gcd(a, b))
> fold(lcm, 1, [1..20])
232792560
Problem 6
The sum of the squares of the first ten natural numbers is, 1^2 + 2^2 + ... + 10^2 = 385$$
The square of the sum of the first ten natural numbers is, (1 + 2 + ... + 10)^2 = 55^2 = 3025$$
Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is $3025 - 385 = 2640$.
Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.
let square = fn (x) => x * x
square(sum([1..100])) - (sum(fmap(square, [1..100])))
``
Once again the numbers are too big