Re[13]: Ультракороткий язык программирования RS
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 21.12.10 17:26
Оценка: 71 (5) +1
Здравствуйте, PC_2, Вы писали:

KV>>"выглядит примерно вот так, хоть пока и не работает" (с)


PC_>У меня в первом списке список программ. И они прекрасно работают.

PC_>Решения в студию от Немерла для всех их пожалуйста.

Да не вопрос:

PC_>//1. факториал

PC_>E 1..5\*

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

public macro @!(e1)
syntax (e1, "!")
{
    <[
        $[1..$e1].FoldLeft(1,_*_)
    ]>
}

// После чего мы можем использовать вот такую запись

WriteLine(5!);

// В результате будет выведено "120"


Если же имеет место второй случай, то из записи "E 1..5\*" ну никак не следует, что это является именно факториалом, если не поломать голову и, исходя от обратного, не предположить, что "\" означает "применить операцию", а "*" то, какую операцию нужно применить. Я сначала это вообще за оставленный по ошибке комментарий принял. В немерловском варианте, этот алгоритм можно найти в макре между <[ и ]> :

$[1..5].FoldLeft(1,_*_)


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

И правильно ли я понимаю, что выражение "1..5" означает "создать массив из пяти элементов, в котором X[i] = i"? Но ведь тогда, для того, чтобы посчитать факториал 1048576, ваша программа отожрет 1 мегабайт памяти только для формирования индексов, в то время, как в том же немерле можно обойтись по старинке:

def factorial(n){ | 0 | 1 = > 1 | _ => factorial(n — 1)}

и никаких мегабайтов отожрано не будет (к вопросу о вашем замечании по поводу быстрой сортировки).

И вообще, как там у вас в языке с ленивыми вычислениями? Можно ли задать последовательность из 10 тысяч элементов, которая будет формироваться по мере необходимости (а-ля функции-генераторы в питоне).

PC_>//2. фибоначчи

PC_>E X:=1..10
PC_>E X.(I+2):=X.I+X.(I+1)
PC_>E X

def f(n) { | 0 | 1 => 1 | _ => f(n-2) + f(n-1) }
def X = $[1..10].Map(f);
WriteLine(X);


PC_>//3. сортировка пузырьком

PC_>E X:=1..10
PC_>E X.I>X.J?X.I:=:X.J
PC_>E X

Здесь среднюю строчку можно было бы и выкинуть, ибо зачем сортировать уже упорядоченную последовательность? Но, ок:

mutable X = $[1..5].ToArray();
_= X.IterI((i, _) => X.IterI((j, _) => when (X[i] < X[j]) X[i] <-> X[j]));
WriteLine(X.ToList())


Кстати, а как у вас обстоят дела с типами? Как будет в этом случае выглядеть сортировка, скажем, строк? Или произвольных объектов? Или функций (если конечно они у вас есть и являются первоклассными)?

PC_>//4. палиндром

PC_>E X:=1,2,3,2,1
PC_>E B:=True
PC_>E B:=B&(X.(5/2-I)=X.(5/2+I))
PC_>E B

mutable X = array[1, 2, 3, 2, 1];
mutable B = true;
_ = $[0..2].IterI((i, _) => {B = B && (X[i] == X[5-i])});
WriteLine(B);

PC_>//5. revers

PC_>E X:=1..5
PC_>E X.(5/2-I):=:X.(5/2+I))
PC_>E X

def reverse(lst, acc = [])
{
| (head :: tail, _) => reverse(tail, head :: acc)
| ([], _) => acc
}
// А теперь, заодно, проверим список на палиндромность еще раз
def X = [1, 2, 3, 2, 1];
WriteLine(reverse(X) == X);

PC_>//6. проверка на простое число

PC_>E X:=6
PC_>E X%2..(X-1)\<

def X = 6;
def B = $[2..X - 1].Fold(true, (x, a) => a && (X % x != 0));
WriteLine(B);


KV>>Я предлагаю сначала поиграть в другую игру: уберите комментарии, объясняющие предназначение каждого сниппета и опросите местный народ на предмет понимания ими того, что делает каждый из кусков кода. Кстати, а зачем эти комментарии вообще понадобились в черезвычайно легком в понимании языке?


PC_>Немерла хоть комментируй хоть не комментируй, разобраться сложно.


Вы в дискусии на что-то более конструктивное, чем "сам дурак", способны? Или сворачиваем беседу? Я пока еще жду внятного ответа на свой вопрос.

KV>>Все дело в том, что он не только от архитектуры оторван


PC_>А от чего еще ?


От реальности. Наиболее хардкорными потребителями сокращенных синтаксисов являются математики. Но у них уже есть масса функциональных языков, поддерживающих фактически их DSL, так сказать, и матлаб впридачу. Для промышленного программирования краткость синтаксиса вообще не является определяющим фактором по сравнению с читаемостью и легкостью поддержки. То, что увидел я из приведенных вами примеров, лично у меня оставило впечатление брейнфака для математиков, в котором количество языковых конструкций на порядки меньше нежели количество неоднозначностей и "неинтуитивностей".

PC_>А пока Немерла, пускай для меня, пасет задних. Пускай и на том наборе простых типовых программ.


Будете капризничать — вообще Влада позову
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.