Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/annimon/own-programming-language-tutorial
Source code for course "How to create your own programming language"
https://github.com/annimon/own-programming-language-tutorial
interpreted-programming-language interpreter java lexer parser programming-language tutorial
Last synced: 4 days ago
JSON representation
Source code for course "How to create your own programming language"
- Host: GitHub
- URL: https://github.com/annimon/own-programming-language-tutorial
- Owner: aNNiMON
- License: mit
- Created: 2015-05-20T08:09:26.000Z (over 9 years ago)
- Default Branch: latest
- Last Pushed: 2024-09-11T20:46:22.000Z (2 months ago)
- Last Synced: 2024-09-12T07:08:35.808Z (2 months ago)
- Topics: interpreted-programming-language, interpreter, java, lexer, parser, programming-language, tutorial
- Language: Java
- Homepage: https://www.youtube.com/playlist?list=PL81SFGIHr5IJFsoWX0qTeQ9_-MFBE552C
- Size: 2.65 MB
- Stars: 122
- Watchers: 18
- Forks: 22
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# OwnLang
OwnLang - dynamic functional programming language inspired by Scala and Python. Available for PC, Android and Java ME devices.
## Installing
| Free | Pro | Desktop |
| :--: | :-: |:------------------------------------------------------------------------------------------:|
| [![Free](https://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=com.annimon.ownlang.free) | [![Pro](https://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=com.annimon.ownlang) | [v2.1.0](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases/tag/v2.1.0) |Also available as AUR package:
```
yay -S ownlang
```## Key features
#### Higher-order functions
Functions are values, so we can store them to variables for operating.
```scala
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: division by zero"
return v1 / v2
}for name, operation : operations {
println "2 " + name + " 3 = " + operation(2, 3)
}
```#### Pattern Matching
Pattern matching with value pattern, tuple pattern, list pattern and optional condition.
```scala
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
}
}
}// run
fizzbuzz()
```#### Functional data operations
Operate data in functional style.
```scala
use std, functionalnums = [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
// Same using stream
println "Sum: " + stream(range(1, 11))
.filter(def(x) = x % 2 == 0)
.map(def(x) = x * x)
.reduce(0, def(x, y) = x + y)
```#### Operator overloading
Why not?
```scala
use std, types, mathdef `..`(a, b) = range(a, b)
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.
```scala
use std, http, functional, json// GET request
http("https://api.github.com/events", def(r) {
events = jsondecode(r)
println events[0]
})// 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
[English](https://annimon.com/docs/ownlang/en/) and [Russian](https://annimon.com/docs/ownlang/ru/)
[Examples](examples/)
## Build
Build using Gradle `./gradlew shadowJar`
or take a look to [latest release](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases/latest) 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 license information](LICENSE)