Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
new FluentTask("warn if website is down")
.Every( TimeSpan.FromMinutes(3) )
.StartingFrom( DateTime.Now )
.When(() => new WebSite("http://example.org").IsNotResponding )
.Execute(() => Notify("admin@example.org", "server down!"))
.Schedule();
task "warn if website is down":
every 3.Minutes()
starting now
when WebSite("http://example.org").IsNotResponding
then:
notify "admin@example.org", "server down!"
Task "warn if website is down"
_every [3] minutes
_starting [date 'now']
_when [web site ["http://example.org"]: not responding] {
Notify "admin@example.org" with "Server down!"
}
_: schedule()
Но синтаксис вторичен.Язык рассчитан не только на однократное «красивое» написание программы. Основной замысел посвящён процессу разработки, включающему рефакторинг например.
Про объекты в o42a вы не до конца поняли. Объект — это не только объект из ООП. Это и действие тоже. Так что это не то же, что обычно имеют ввиду под «всё есть объект», а на самом деле стыдливо умалчивают о множестве других сущностей. o42a в этом смысле идёт до конца.
Это лишь форма, а важно содержание.
Сколько-нибудь сложный рефакторинг может сделать только человек, а не компьютер.
В сколько-нибудь сложном проекте изменения в уже написанном коде неизбежны.
Вы упорно воспринимаете «объект» как то, над чем производятся действия. Расширьте своё понимание. Замените термин «объект» на другой, подходящий как действиям так и, собственно, объектам.
Это до тех пор, пока форма не мешает получить доступ к содержанию.
Человек выбирает только что нужно сделать. Переименовать, инкапсулировать, переместить, реорганизовать. Выполняет эту операцию (в нормальных современных языках и IDE) — компьютер.
Тем не менее, читается код чаще.
Потому что это нормальное понимание для естественного языка.
Верно. Разве я с этим спорю?
Ох, какое же наивное понимание рефакторинга.
Где я писал, что читать код — не важно?
Это — термин.
Да; когда говорите, что синтаксис не важен.
Синтаксис вторичен. Это лишь форма, а важно содержание. Синтаксис лишь предоставляет к ней доступ и должен делать это хорошо.
Нет, это цель. Я хочу, чтобы рефакторинг был таким.
… введенный вами. Не ожидайте, что все остальные будут его понимать; особенно учитывая, что он противоречит понятию из естественного языка.
Я говорю, что он «вторичен», а не «не важен». Вот мои слова:
То есть Вы никогда не хотите делать ошибок и решать проблемы одним махом?
Метапрограммирование, например, относится к алгоритмам как к объектам.
Ошибки разные бывают. Вы хотите совершать лишь определённые их виды и не хотите совершать другие, пусть и более серьёзные.
Вы цепляетесь к словам, а приведённые примеры отказываетесь трактовать всего лишь как контр-примеры вашим постулатам, просто не желая смотреть на вещи шире.
Sign := > integer ( ~~ Функция арифметического знака.
Arg :=< integer ~~ Аргумент функции
Arg < 0? = -1 ~~ Если аргумент отрицателен - вернуть `-1'.
Arg > 0? = 1 ~~ Иначе, если аргумент положителен - вернуть `1`.
= 0 ~~ Иначе - вернуть `0`.
)
I := ``1 ~~ Переменная - счётчик цикла.
{
Print [i] nl
I = i + 1
I <= 10? ...
}
def, пыжащиеся поднять читаемость, а на самом деле воспринимаемые как всё те же значки. Но это только моё мнение.Не вижу, чем это хуже чем, например, C.
Вот только если вы уже добрались до чтения реализации алгоритма (например, в поисках ошибки), то весьма спорно что DSL поможет, скрывая от вас её детали.
void strcpy (char *s, char *t) {
while (*s++ = *t++) ;
}Это вам хорошо с высоты 2012 года говорить.
Программа должна быть понятна читающему, и это достигается более строгой формализацией и «универсализацией» синтаксиса…
import System.Net
import System.IO
if argv.Length != 2:
print "You must pass [prefix] [path] as parameters"
return
prefix = argv[0]
path = argv[1]
if not Directory.Exists(path):
print "Could not find ${path}"
return
listener = HttpListener()
listener.Prefixes.Add(prefix)
listener.Start()
while true:
context = listener.GetContext()
file = Path.GetFileName(context.Request.RawUrl)
fullPath = Path.Combine(path, file)
if File.Exists(fullPath):
context.Response.AddHeader("Content-Disposition", "attachment; filename=${file}")
bytes = File.ReadAllBytes(fullPath)
context.Response.OutputStream.Write(bytes, 0, bytes.Length)
context.Response.OutputStream.Flush()
context.Response.Close()
else:
context.Response.StatusCode = 404
context.Response.Close()
I can’t emphasize enough the importance of making a good first impression with your DSL. It can literally make or break your project. You need to make a real effort to ensure that the user’s first impression of your system will be positive.
А можно назвать это DSL.
Вторая идея o42a — это возможность разделения языковой семантики и синтаксиса. Синтаксис не обязан один-в-один соответствовать языковым сущностям, сколь бы универсальны они ни были. Синтаксис должен выражать семантику программы, а не языка программирования. Он должен быть удобен для восприятия и достаточно строг. Это задача компилятора, а не программиста, приводить текст программы к языковым сущностям.
Можно сопоставить синтаксис с представлением, а программные сущности — с моделью из парадигмы MVC. А можно назвать это DSL.
Язык программирования o42a