LINUX.ORG.RU

Вышел релиз языка программирования truthon

 , ,


4

4

Представляю вашему вниманию свеженький релиз так полюбившегося всем вам ЯП — гибрид хаскеля с питоном, руби и крестами. Этот код почти никогда не писался на трезвую голову и поэтому разобраться в этом месиве могу только я.

1. Самое главное: оно поддерживает три типа комментариев и новые способы легко добавить!

# shell
// кресты
/* си */

2. Синтаксис слегка пришибленый (пришлось подпилить под нужды парсера), но какой уж есть. Вот небольшой пример стандартной программы «привет, Ад»:

main = (argv, argc) ->  # объявили лямбда-функцию и сохранили её в main
  name = "Hell"
  the_string = p "Hello, {name}"   # оператор p печатает на экран
                                   # и возвращает значение своего аргумента
  # fancy string interpolation
  num = 1
  string_with_number = "num = {num}"
  
  # shell invocation
  ret = `echo -e 'Bye!\nrm -rf ~'`
  p "script terminated with {ret}"

  # built-in repexp matching
  p "Hello" =~ /(H.*)/

  # branching
  1 if 1+1 == 2 else 3
  
  # expression-oriented!
  score = match
    name =~ "true_(.*)"  => 666
    name == "tailgunner" => 7
    _                    => -1

  # Higher-order functions: a(b(c()) is ...
  a . b . c  
  c $ b $ a  # pipe-line style

Итд итп. Самое главное что он expression-oriented и со статической типизацией**.

В ближайших планах переписать этот ЯП на нём же самом.

Ведутся активные переговоры с Леннартом Поттерингом по включению этого ЯП в состав systemd как средства написания юнитов.

Фичи и плюши: строгая типизация, expression-oriented, компилируемый*, есть примитивный вывод типов**. Некоторые операторы (в данный момент только print) полиморфны. Вскоре: замыкания, pattern matching, ADT, ООП с public/private/close, генерация llvm bitcode и многое другое. Циклов ещё нет, поэтому используйте рекурсию. На данный момент поддерживается только работа с целыми числами (произвольной длины) и строками. Поддержка других типов будет хорошим упражнением для пытливого читателя.

Отдельно хотелось бы отметить будущую программу сертификации. Программа сертификации задумана чтобы повысить квалификацию программистов. Программа бесплатная и, в общем- то, никаких реальных бонусов и привилегий не даст (мы же не проприетарщики). Так что я пока не знаю зачем кто-то захочет её проходить. Может, приплачивать надо...

PS Про nanopass читал

PPS Формочку заполнил

*Эта функция не работает

**Есть, но оочень глючит.

Лицензия BDSM-like

Changelog

>>> Исходники

★★★★★

Проверено: Pinkbyte ()

Очень интересно. А можно ли реализовать лиспоподобный синтаксис?

dogbert ★★★★★ ()
Ответ на: комментарий от dogbert

Увы, из коробки (set name var) пока не умеет, но это реально пара строчек кода. А пока можно начать с такого:

# небольшая оберточка
ifelse = (cond, then, otherwise) -> 
 then if cond else otherwise

main = 
 (ifelse (cond) (then) (otherwise))  # вот тут почти лисп!
true_admin ★★★★★ ()

p «script terminated with {ret}

Незакрытая кавычка - это фича?

tailgunner ★★★★★ ()
Ответ на: комментарий от true_admin

вот он, язык моей мечты! жалко скобочек маловато. А отступы обязательны и везде табы?

fish_ka ()

включению этого ЯП в состав systemd как средства написания юнитов.

это было бы замечательно, не будь праздника

Deleted ()

Слишком хорошо, чтобы быть правдой.

Dark_SavanT ★★★★★ ()
Ответ на: комментарий от fish_ka

А отступы обязательны и везде табы?

Да, обязательны. Но переделать под скобочки очень просто. Надо лишь заменить функцию indent.parse().

true_admin ★★★★★ ()
Ответ на: комментарий от tailgunner

где в этом чуде pattern matching?

Нету потому что не готова поддержка ADT и тьюплов. Но планируется. Сначала надо бы «вывод типов» (если это можно так назвать, принцип работы, по-моему, как в rust) доделать, через недельку займусь этим.

true_admin ★★★★★ ()

Все уже давно придумано.


begin # Algol-68 prime number sieve, functional style #

proc error = (string s) void:
(print(( newline, " error: ", s, newline)); goto stop);
proc one to = (int n) list:
(proc f = (int m,n) list: (m>n | nil | cons(m, f(m+1,n))); f(1,n));

mode list = ref node;
mode node = struct (int h, list t);
proc cons = (int n, list l) list: heap node := (n,l);
proc hd = (list l) int: ( l is nil | error(«hd nil»); skip | h of l );
proc tl = (list l) list: ( l is nil | error(«tl nil»); skip | t of l );
proc show = (list l) void: ( l isnt nil | print((" ",whole(hd(l),0))); show(tl(l)));

proc filter = (proc (int) bool p, list l) list:
if l is nil then nil
elif p(hd(l)) then cons(hd(l), filter(p,tl(l)))
else filter(p, tl(l))
fi;

proc sieve = (list l) list:
if l is nil then nil
else
proc not multiple = (int n) bool: n mod hd(l) ≠ 0;
cons(hd(l), sieve( filter( not multiple, tl(l) )))
fi;

proc primes = (int n) list: sieve( tl( one to(n) ));

show( primes(100) )
end

vada ★★★★★ ()

Зачем фигурные скобки в интерполяции, пусть матчит любое слово, чтобы громче стреляло

vertexua ★★★☆☆ ()

теги: python, программирование, упорин

Так как выражение python == упорин истинно, то получается ерунда позорящее программирование:

теги: упорин, программирование, упорин

ps: Впрочем, python позорил программирование еще до того как стало известно что он синоним упорина.

ps к ps: Не важен подход к python, важно знать что там все плохо.

anonymous ()

Добрый день уважаемый автор языка, компания, в которой я работаю, находится в поисках ЯП для одного серьёзного проекта, и мой тимлид предложил мне ваш тритон. Не могли бы Вы, пожалуйста, удалить репозиторий Вашего ЯП и все упоминания в интернетах о нём, а заодно, очень надо, пристрелите моего тимлида. С благодарностью, Ванька, из д. Старые Опухлики и дед Семён, сведующий в компьютерной грамоте.

pseudo-cat ★★★ ()

Лицензия

========

Права пользователя

------------------

1. Запрещено пользоваться программой а так же читать и модифицировать исходный код.

1. Данное лицензионное соглашение тоже часть исходного кода.

Ответственность сторон

----------------------

1. В случае нарушения данного соглашения пользователь должен отдать свои почку и сердце.

I lol'd.

theNamelessOne ★★★★★ ()
Ответ на: комментарий от vada

Все уже давно придумано.

У алгола есть фатальный недостаток.

true_admin ★★★★★ ()
  ret = `echo -e 'Bye!\nrm -rf ~'`

А что будет в ret? Код возврата? Если да, то как получить stdout и stderr?

anonymous ()

Эммм, 1 апреля? Не то, чтобы я не верил, но как-то совпало с pony-day.

anonymous ()
Ответ на: комментарий от anonymous

А что будет в ret?

Я ошибся, там будет stdout. Я думаю, рациональнее всего возвращать (ret, stdout, stderr). Но т.к. тьюплы не поддерживаются я пока не стал заморачиваться. Т.е. пока оно устроено вот так:

from subprocess import check_output

@replaces(ast.ShellCmd)
class ShellCmd(Str):
  def eval(self, frame):
    cmd = super().eval(frame).to_string(frame)
    raw = check_output(shlex.split(cmd))
    return Str(raw.decode())
true_admin ★★★★★ ()
Ответ на: комментарий от mittorn

Я когда ночью её увидел, вспомнил xkcd'шный стрип про сделку с дьяволом, который мне всё равно лень постить.

dogbert ★★★★★ ()

А чем он лучше, скажем, Eiffel?

eSyr ★★ ()
Ответ на: комментарий от true_admin

там будет stdout

А как передать туда что-то в stdin?

anonymous ()

Вскоре: замыкания, pattern matching, ADT, ООП с public/private/close, генерация llvm bitcode и многое другое.

*Эта функция не работает

**Есть, но оочень глючит.

Мы вам перезвоним.

Deleted ()
Ответ на: комментарий от anonymous

А как передать туда что-то в stdin?

На данный момент, увы, никак. Как только появятся классы и базовый модуль io то можно, например, будет сделать, например, так:

prog = Shell "your-cool-prog with arguments"
select-loop prog
   prog.stdout => p "got output: {<<< prog}"
   prog.stdin  => "data for stdin" >>> prog
   prog.dead   => p "process died" && break

Но я над этим ещё особо не думал. Знаю только что хочу сделать встроенный eventloop аля gevent.

true_admin ★★★★★ ()

Судя по исходникам написано на питоне

rogerw ()

Отлично! Уже записываюсь на курсы.

Gonzo ★★★★★ ()

Лучше б каждому по паре звезд добавили. Было бы первоапрельнее :)

Gonzo ★★★★★ ()

печаль. неужели никто - ничего смешнее не придумал на 1 апреля.

maxt ()

а ООП есть? Или 365 дней ждать?

emulek ()

Годнота!

Ушел переписывать все рабочие проекты на truthon.

unfo ★★★★★ ()

Джва года юзаю в хайлоад-энтерпрайзе, брат жив.

serst ()
Ответ на: комментарий от true_admin

Хе! Всего один?
Зато он похож на все языки сразу :)

vada ★★★★★ ()

что за ужасный новый дизайн на сайте? админ в детство впал? и почему именно пони, а не телепузики?

anonymous ()
Ответ на: комментарий от anonymous

почему именно пони, а не телепузики?

Тсссссс....

kravich ★★★★ ()
Ответ на: комментарий от tailgunner

Твою бы энергию да использовать в мирных целях.

Например? (По-моему, продвинутый линтер для питона уже почти сделали.)

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Твою бы энергию да использовать в мирных целях.

Например?

Что-нибудь полезное не только для тебя. Тот же Livescript пригоден для работы в вебе, ибо компилируется в JS. А Truthon с «everything is in elf» - ну где его применить?

По-моему, продвинутый линтер для питона уже почти сделали.

Кто и где? Недавно открыли PySonar2, правда, там Ява и тотальный ынтерпрайз.

tailgunner ★★★★★ ()

Canonical уже приступили к переписыванию Unity на сабж.

ilinsky ★★★★ ()

Переписал проэкт на сабже, вместо 100к LOC получилось ~ 800.

maverik ★★ ()

Хватит петросянить! Чёрт.

X10Dead ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.