Возможности

OwnLang — скриптовый функциональный язык программирования с динамической типизацией для ПК и Android устройств.

Ключевые особенности

Функции высшего порядка

Функции выступают как значения, а значит мы можем сохранять их в переменные для дальнейшего использования.

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 "ошибка: деление на ноль"
  return v1 / v2
}

for operation : operations {
  println operation(2, 3)
}

Pattern Matching

Сопоставление по образцу с шаблоном значений, шаблоном кортежей, шаблоном списков и дополнительным сравнением.

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
    }
  }
}

Функциональные операции над данными

Оперирование данными в функциональном стиле.

use std, functional

nums = [1,2,3,4,5,6,7,8,9,10]
nums = filter(nums, def(x) = x % 2 == 0)
// Квадраты чётных чисел
squares = map(nums, def(x) = x * x)
foreach(squares, ::echo)
// Сумма квадратов
sum = reduce(squares, 0, def(x, y) = x + y)
println "Сумма: " + sum
// То же самое с использованием stream
println "Сумма: " + stream(range(1, 11))
  .filter(def(x) = x % 2 == 0)
  .map(def(x) = x * x)
  .reduce(0, def(x, y) = x + y)

Перегрузка операторов

Почему бы и нет?

use std, types, 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)
}

Модуль для работы с сетью Интернет

Простые асинхронные HTTP-запросы с модулем http.

use std, http, functional

// GET-запрос
http("https://api.github.com/events", def(r) {
  use json
  events = jsondecode(r)
})

// POST-запрос
http("http://jsonplaceholder.typicode.com/users", "POST", {
  "name": "OwnLang",
  "versionCode": 10
}, ::echo)

// PATCH-запрос
http("http://jsonplaceholder.typicode.com/users/2", "PATCH", {"name": "Патч"}, ::patch_callback)

def patch_callback(v) {
  println v
}