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 ()
Последнее исправление: true_admin (всего исправлений: 8)
Ответ на: комментарий от dogbert

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

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

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

включению этого ЯП в состав 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 ★★★★★
()
  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 ★★
()

Вскоре: замыкания, 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 ★★★★★
() автор топика

плюши

Питерцы в треде!

buddhist ★★★★★
()

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

rogerw
()

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

Gonzo ★★★★★
()

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

Gonzo ★★★★★
()

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

maxt
()

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

emulek
()

Годнота!

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

unfo ★★★★★
()

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

serst
()

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

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

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

Тсссссс....

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

Всего один?

да

похож на все языки сразу

И это пугает.

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

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

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

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

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

Например?

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

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

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

tailgunner ★★★★★
()

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

ilinsky ★★★★★
()

С первым апреля!

Ну толсто же :).

sleepflint ★★★
()

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

maverik ★★
()

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

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