LINUX.ORG.RU

\[палёный мёд\] фантазии на тему своего ЯП

 , , ,


0

4

Привет, котаны!

Я решился на отчаянный шаг — поэкспериментировать с компиляторами. После долгого сидения я понял что питон это не то — надо шагнуть дальше. Ну, хотя бы в с т.з. функционального программирования. Сразу скажу что концепции я пока не вижу и ответов на фундаментальные вопросы типа степень ленивости языка, всякие там монады, в каком виде делать ООП (и делать ли?) у меня нет. Но всё же забавно поиграться просто с синтаксисом.

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

/* DATA TYPES */
//ints and floats, types are infered from the value
i = 1; f = 1.0
// list
l = [1,2,3]
//tuple (arguments of functions are passed in tuples)
t = 1, 2, 3
//tuple with named fields
tuple X: a, b, c
x = X a=1, b=2, c=3
// the same but with optional parens
x = X(a=1, b=2, c=3)
// access tuple attrs
print x.a, x.b, x.c
//hashes
{}  // empty hash
h = {b=>2,a=>1}
print h.keys // -> "pb, a]" because hashes preserve insert order

//regular expressions
pattern = /[A-z][a-z]{1-2}/


/* BASICS */
// define variable
x = 1

// define function "z" of two args
z x:int, y:int = 2*x + y

// function invocation
z 1, 2
// or
z x=1, y=2

// composition, equivalent of print(z(1,2))
print z 1, 2

// conditions:
if a > 2:
  pass
//if-else in one line
if x == 2: {x = 3} else: {x = 4}
//regexp
if x ~= //


switch x:
  x == 1: pass
  x < 10: print("x is really less than 10")
          continue  # go down
  x < 5 : print("x ")
  _     : print("what a strange X")


/* SUGAR */

# shell invocation
x = `ps ax | wc -l`


# equivalent of vm = VM(); ...; vm.stop()
vm1 = VM(), vm2 = VM():
  on cleanup:
    vm1.stop and vm2.stop():
  ...


/* HIGHER ORDER FUNCTIONS */
# a(b(c))
c | b | a
a . b . c

/* GROUPING */
// block may appear at any place where expression is acceptable.
// the return value is the last statement
// statements are separated by semicolon.
x = true
if x: {print "it turned out that x is true"; x=false}
else: {print "x is false, sad but true"; }


/* HELLO, WORLD */
main argv =
  print "hello, hell"
  print "my args:", argv

/* STRING SUBSTITUTION */
x = 666
print "x is equal to ${x+1}" // equivalent of { tmp = x+1; printf("x is equal to %d\n", tmp) }

/* EXCEPTIONS */
// catch exception and get its value in _err
fd = open "filename" || die "exception ${_err}"

try:
  fd = open "filename"
except NotFound:

fd = try {open "filename"} except NotFound: -1


/* LANGUAGE MODES */
//shell invocation in backticks
files = `ls -la /tmp`
`for f in ${files}; do scp $f remote:/tmp; done` \
  || die "scp failed with ${_err}"


/* COMMENTS */
// this is a comment
# and this is a comment
/* and this as well */
; have fun with many comment styles


/* SMALL THINGS */
for elem in some_list:
  ...
print elem  //will raise error because loop variables are not seen outside the loop by default

// for this reason file will be automaticaly closed once the control reach the end of the loop
for l in os.open("some_file"):
  ...

PS кодовое название — velosipedix. PPS case ymn, archimag, baverman, tailgunner, qnikst, mv и всех других кого забыл :)

PPPS похоже что инета у меня не будет до воскресенья...

★★★★★

Последнее исправление: CYB3R (всего исправлений: 2)
Ответ на: комментарий от www_linux_org_ru

ну, было бы мегакруто иметь возможность вводить свои операторы с заданным приоритетом и ассоциативностью.

Хотелось бы так же private/public/protected атрибуты класса.

Интегрированный event loop и встроенные гринлеты. Правда, к синтаксису это отношения не имеет.

Так же хотелось бы что бы методы которые делают in-place обновления возвращали своё значение чтобы можно было строить цепочку функций типа list.sort().remove(0).append(2). Щас sort() значение не возвращает (потому что решили что in-place функции не должны ничего возвращать), но в реальности, имхо, это не всегда удобно.

К сожалению, больше на ум ничего не приходит, я на питоне ничего сложного давно не прогал.

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

для таких целей обычного текстового редактора мало, программировать придётся из ascii-редактора :)

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

программировать придётся из ascii-редактора

а *постоянно* писать это руками я и не собираюсь — есть нормальные редакторы с экспортом скажем в тех, из него генерится эта фигня и вставляется в исходник

это все выглядит весьма убого, но все же в *текстовом* файле смотрится лучше, чем записанное в строчку, и при необходимость это можно прямо там и поправить

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от true_admin

Хотелось бы так же private/public/protected атрибуты класса.

__protected__my_package__my_class_name__my_variable_name в питоне, и просто protected my_variable_name у тебя в языке

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

ну и вообще, тебя тапл-ом перепугали, а на самом деле изначальная статическая типизация нужна только тому, кому нужна скорость и аерокосмическая надежность¹ — а опциональная статическая типизация вполне подходит тому, кто не знает, что он хочет... ну то есть тебе

_________________________________

¹ правда от нее польза есть и в других случаях, но я говорю о том, кому она именно *нужна*

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от true_admin

и вообще щас у меня ночь, я соображаю плохо (хотя *первое* сообщение писал *ранее обдуманно*)

дроби мне в исходнике, скармилваемом *питону*, потребуется править редко (т.к. там чаще всего нагрузка — однозначно нужен с++), а вот в repl-e поправить их вполне даже было бы полезно, и там «двумерная» форма полезна

я так надеюсь, что repl ты планируешь

всякие фенечки типа интеграции техмакс-а с максимой че-то мне не нравятся и явно подтормаживают, ну и лисп все-таки не так приятно программировать, как питон

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от true_admin

Есть много спорных идей. Они плохо ложаться на синтаксис питона. Именно поэтому я в итоге попытался отойти от питона вообще.

А не надо ложить идеи на синтаксис. Маскот прав - нужен тайпчекер, который будет отлавливать в статике всё, что сможет. Этот чекер не обязан быть 100% точным - его ошибки выловит рантайм, но очень хотелось бы выловить побольше ошибок до запуска. Pylint слишком примитивен в этом плане, pyflakes еще примитивнее. Возможно, что-то получится слепить на основе python-jedi или mini-pysonar.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от anonymous

что подразумевается под «опциональной» типизацией?

в разных случаях это могут быть чуть разные вещи, но в данном — что ТС в полученном им AST не удаляет ноды, содержащие опциональную информацию о типе, но в то же время никак их не обрабатывает (оставляя эту возможность другим; другие тоже эти ноды обрабатывать не обязаны)

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от www_linux_org_ru

Это называется аннотация и к типизации отношение имеет... весьма опосредственное т.к. в самом ЯП типов как не было так и нет.

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