mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Source code for course "How to create your own programming language"
examples | ||
gradle/wrapper | ||
libs | ||
nbproject | ||
src | ||
.gitignore | ||
.travis.yml | ||
build.gradle | ||
build.xml | ||
gradlew | ||
gradlew.bat | ||
LICENSE | ||
program.own | ||
proguard.properties | ||
README.md | ||
tests.own | ||
visitor.own |
OwnLang
Free | Pro | Desktop |
---|---|---|
v1.2.0 |
OwnLang - dynamic functional programming language inspired by Scala and Python. Available for PC, Android and Java ME devices.
Key features
Function values
Functions are values, so we can store them to variables for operating.
operations = {
"+" : def(a,b) = a+b,
"-" : def(a,b) = a-b,
"*" : def(a,b) = a*b,
"/" : ::division
}
def division(v1, v2) {
if (v2 == 0) return "error"
return v1 / v2
}
for operation : operations {
println operation(2, 3)
}
Pattern Matching
Pattern matching with value pattern, tuple pattern, list pattern and optional condition.
def factorial(n) = match n {
case 0: 1
case n if n < 0: 0
case _: n * factorial(n - 1)
}
def fizzbuzz(limit = 100) {
for i = 1, i <= limit, i++ {
println match [i % 3 == 0, i % 5 == 0] {
case (true, false): "Fizz"
case (false, true): "Buzz"
case (true, true): "FizzBuzz"
case _: i
}
}
}
Functional data operations
Operate data in functional style.
use "std"
use "functional"
nums = [1,2,3,4,5,6,7,8,9,10]
nums = filter(nums, def(x) = x % 2 == 0)
// Squares of even numbers
squares = map(nums, def(x) = x * x)
foreach(squares, ::echo)
// Sum of squares
sum = reduce(squares, 0, def(x, y) = x + y)
println "Sum: " + sum
Operator overloading
Why not?
use "std"
use "types"
use "math"
def `..`(a, b) = range(a, b - 1)
def `**`(a, b) = int(pow(a, b))
for y : 1 .. 10 {
println sprintf("2 ^ %d = %d", y, 2 ** y)
}
Network module
Easy async HTTP requests with http
module.
use "std"
use "http"
use "functional"
// GET request
http("https://api.github.com/events", def(r) {
use "json"
events = jsondecode(r)
})
// POST request
http("http://jsonplaceholder.typicode.com/users", "POST", {
"name": "OwnLang",
"versionCode": 10
}, ::echo)
// PATCH request
http("http://jsonplaceholder.typicode.com/users/2", "PATCH", {"name": "Patched Name"}, ::patch_callback)
def patch_callback(v) {
println v
}
Language specification
Available on GitBook (English and Russian)
Build
Build using Gradle ./gradlew dist
or Ant ant clean pack
or take a look to latest release for binaries.
Run
To run script use command
java -jar OwnLang.jar -f input.own
or
java -jar OwnLang.jar < input.own
License
MIT - see MIT licence information