Семантика и выразительность языка
От: varenikAA  
Дата: 30.04.19 04:21
Оценка:
Решил похожий код визуализировать на различных языках.
Вот что получилось.
Dlang:

import std.stdio;
void main() {
auto i = 0;
foreach( e ; 1 .. 11) {
    i++;
    if(e % 2 == 0)
        writeln(i,  "=", e);
 }
}


В D2 есть foreach с индексом, но при использовании генератора код не компилируется,
кроме того последний элемент отбрасывается. Вывод — основное преимущество Ди — скорость загрузки и выполнения.

FSharp:

[1..10]
|> List.mapi ( fun i v -> (i,v))
|> List.filter (fun (_,v) -> v % 2 = 0)
|> List.iter (fun (i,v) -> printfn "%d = %d" i v)


Неплохо, с учетом использования только ядреных функций, минус — многословный синтаксис лямбд, медленная загрузка кода перед выполнением.
плюс — очевидная семантика, информативные сообщения компилятора.

CSharp:

using System;
using System.Linq;
using System.Collections.Generic;
class Program {
    static void Main(string[] args) {
        foreach (var e in Enumerable.Range(1, 10).Select((e, i) =>
              new { Index = i, Value = e }))
            if (e.Value % 2 == 0)
                Console.WriteLine($"{e.Index} = {e.Value}");
    }
}


Минус — необходимость использования дополнительных библиотек, плюс — очевидная семантика.

Nemerle:

#pragma indent
using Nemerle
using System.Console
foreach(c when c % 2 == 0 in $[1 .. 10] with i)
    WriteLine($"a[$i] = $c")

самый компактный и очевидный синтаксис,
делает то, что видим и предполагаем. Понимает отступы вместо скобок. Считаю код на отступах более понятным.

Common Lisp:

(let ((i 0)) 
    (loop for e from 1 to 10 
        do 
        (incf i) 
        (cond 
            ((= (mod e 2) 0) (format  t "~A = ~A~%" i e)))))



Из плюсов — гомоиконность языка, семантика очень простая — выражение список, первый элемент — форма, остальные элементы аргументы формы).
Из минусов — экзотический, требует владения специальным редактором. по умолчанию работает только в среде интерператора, значительно отличающаяся
модификация clojure — позволяет компилить код в java-байт код.

А вам, семантика кого языка кажется более естественной для человеческого мышления?
Нужен ли языку расширяемый синтаксис или достаточно расширения на основе библиотек?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Отредактировано 30.04.2019 4:29 Разраб . Предыдущая версия . Еще …
Отредактировано 30.04.2019 4:27 Разраб . Предыдущая версия .
семантика
Re: Семантика и выразительность языка
От: MadHuman Россия  
Дата: 30.04.19 05:35
Оценка:
Здравствуйте, varenikAA, Вы писали:


AA>FSharp:


AA>
AA>[1..10]
AA>|> List.mapi ( fun i v -> (i,v))
AA>|> List.filter (fun (_,v) -> v % 2 = 0)
AA>|> List.iter (fun (i,v) -> printfn "%d = %d" i v)
AA>


AA>Неплохо, с учетом использования только ядреных функций, минус — многословный синтаксис лямбд, медленная загрузка кода перед выполнением.

AA>плюс — очевидная семантика, информативные сообщения компилятора.

F# вариант 2
for i=1 to 10 do
  if i % 2 = 0 then
    printfn "%d = %d" (i-1) i


по моему проще уже некуда.

не знал что Nemerle умеет синтаксис на отступах.. круто! жаль что заброшен, макросы иногда хочется.


AA>Нужен ли языку расширяемый синтаксис или достаточно расширения на основе библиотек?

нужен. нужны нормальные макросы, возможности dsl-я строения.
Re: Семантика и выразительность языка
От: Kolesiki  
Дата: 30.04.19 05:43
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Dlang:

AA>foreach( e ; 1 .. 11) {
AA>В D2 есть foreach с индексом, но при использовании генератора код не компилируется,
AA>кроме того последний элемент отбрасывается. Вывод — основное преимущество Ди — скорость загрузки и выполнения.

Подобную АНАЛитику принято называть "газификация луж".
Уж кто-кто, а D — единственный адекватный преемник C++. C# как бы тоже здорово, но его возможности отстают.
Re[2]: Семантика и выразительность языка
От: varenikAA  
Дата: 30.04.19 06:06
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>Здравствуйте, varenikAA, Вы писали:


AA>>Dlang:

AA>>foreach( e ; 1 .. 11) {
AA>>В D2 есть foreach с индексом, но при использовании генератора код не компилируется,
AA>>кроме того последний элемент отбрасывается. Вывод — основное преимущество Ди — скорость загрузки и выполнения.

K>Подобную АНАЛитику принято называть "газификация луж".

K>Уж кто-кто, а D — единственный адекватный преемник C++. C# как бы тоже здорово, но его возможности отстают.

C# прикладной язык, d — системный. Полноценное сравнение невозможно,
я смотрел на код с точки зрения понятности. Александреску никогда
не скрывал, что дизайнил язык с оглядкой на питон, однако в данном примере
очевидно ограничение операторов перед выражениями. Хотя string mixin и т.п.
и позволяют слегка расширить горизонты.

Однако, насчет преемника с++ навряд ли. Чтобы стать приемником, нужна более менее обширная база библиотек под различные нужды.
Александреску сам признает тот, что библиотеки появляются и бросаются. Это многих новичков отпугивает.
В .net хоть и меньше чем в java, но все же больше готового функционала. Промолчу про питон.
И что может быть самое главное, язык или технология становятся популярными в многом благодаря авторитетам и их пиару.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Семантика и выразительность языка
От: pagid Россия  
Дата: 30.04.19 08:56
Оценка: +1
Здравствуйте, varenikAA, Вы писали:

AA>CSharp:

Почему так сложно? Продемонстрировать некие возможности языка интересные тебе?
Re[2]: Семантика и выразительность языка
От: varenikAA  
Дата: 30.04.19 13:08
Оценка:
Здравствуйте, pagid, Вы писали:

P>Здравствуйте, varenikAA, Вы писали:


AA>>CSharp:

P>Почему так сложно? Продемонстрировать некие возможности языка интересные тебе?

Почему нет? Форум для обмена инфой придуман.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Семантика и выразительность языка
От: alexzzzz  
Дата: 30.04.19 13:13
Оценка: +4
Здравствуйте, varenikAA, Вы писали:

AA>CSharp:


AA>
AA>using System;
AA>using System.Linq;
AA>using System.Collections.Generic;
AA>class Program {
AA>    static void Main(string[] args) {
AA>        foreach (var e in Enumerable.Range(1, 10).Select((e, i) =>
AA>              new { Index = i, Value = e }))
AA>            if (e.Value % 2 == 0)
AA>                Console.WriteLine($"{e.Index} = {e.Value}");
AA>    }
AA>}
AA>

Ради чего это всё?

class Program
{
    static void Main()
    {
        for (int i = 1; i <= 10; i++)
        {
            System.Console.WriteLine($"{i} = {i % 2 == 0}");
        }
    }
}
Re[2]: Семантика и выразительность языка
От: varenikAA  
Дата: 30.04.19 14:05
Оценка:
Здравствуйте, alexzzzz, Вы писали:

A>Здравствуйте, varenikAA, Вы писали:


AA>>CSharp:


AA>>
AA>>using System;
AA>>using System.Linq;
AA>>using System.Collections.Generic;
AA>>class Program {
AA>>    static void Main(string[] args) {
AA>>        foreach (var e in Enumerable.Range(1, 10).Select((e, i) =>
AA>>              new { Index = i, Value = e }))
AA>>            if (e.Value % 2 == 0)
AA>>                Console.WriteLine($"{e.Index} = {e.Value}");
AA>>    }
AA>>}
AA>>

A>Ради чего это всё?

A>
class Program
A>{
A>    static void Main()
A>    {
A>        for (int i = 1; i <= 10; i++)
A>        {
A>            System.Console.WriteLine($"{i} = {i % 2 == 0}");
A>        }
A>    }
A>}


Ну, во-первых Range был лишь как способ сгенерить данные, вместо инта может быть
более сложная структура, по этой же причине выводятся кроме индекса еще и значения.
Вместо вывода подразумевается любое действие с данными. Для простоты примера — вывод на консоль.
{i % 2 == 0}

Что выводим здесь? true or false? Как это использовать?
По-моему, мой пример делает не тоже самое.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Семантика и выразительность языка
От: pagid Россия  
Дата: 30.04.19 16:40
Оценка: +1
Здравствуйте, varenikAA, Вы писали:

AA>Почему нет?

Ну вот. А я то думал, что рассмотреть пример решения простой задачи на разных языках.

AA>Форум для обмена инфой придуман.

Инфой о том как наиболее пространно и модно написать простую вещь? Возможно даже, что это интересное занятие, вот только для сравнения выразительности языков плохо подходит. Или как вариант, придется придумать задачу в которой применение таких средств оправдано, и эти средства делаею запись действительно выразительной.
Re[4]: Семантика и выразительность языка
От: alexzzzz  
Дата: 30.04.19 20:30
Оценка:
Здравствуйте, pagid, Вы писали:

AA>>Почему нет?

P>Ну вот. А я то думал, что рассмотреть пример решения простой задачи на разных языках.

Тут не поставлена сама задача.

Единственная задача компьютеров ― преобразовывать определённого вида входные сигналы в определённого вида выходные сигналы. Единственная задача программ, по которым они работают, ― преобразовывать входные данные в определённом виде в выходные данные в определённом виде.

Если задача ставилась как «для заданного диапазона чисел показать в консоли, кто чётный, кто нечётный», то действительно, зачем переусложнять? А если нет, то непонятно, в чём заключается практическая задача, которую программа должна решать. Где у неё входные данные, где выходные.
Отредактировано 30.04.2019 20:34 alexzzzz . Предыдущая версия .
Re: Семантика и выразительность языка
От: koenig  
Дата: 30.04.19 21:01
Оценка:
мужики, изолента есть rosettacode упоминали?
Re[2]: Семантика и выразительность языка
От: Kolesiki  
Дата: 01.05.19 19:06
Оценка:
Здравствуйте, koenig, Вы писали:

K>мужики, изолента есть rosettacode упоминали?


Да кому нужны эти объективные сравнения! Тут чел пришёл натягивать сову на глобус — наверное решил, что его личное мнение тут кому-то нужно.
Как писали на C#, так и будем! Но Ди и Немерле всё равно остаются на голову выше.
Re: Семантика и выразительность языка
От: Kolesiki  
Дата: 01.05.19 19:18
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>А вам, семантика кого языка кажется более естественной для человеческого мышления?


Любая, кроме функциональной. Ну и мышление — глупо его сравнивать с крючками синтаксиса. Какой синтаксис выучил, на том и думаешь!

AA>Нужен ли языку расширяемый синтаксис или достаточно расширения на основе библиотек?


Это неправильный вопрос. Его неоднозначность в том, что в принципе язык можно и нужно улучшать наиболее простым способом. Тут Немерля прямо фаворит! Но прикол в том, что если ЛЮБОЙ будет лепить свои синтаксисы, посторонний кодер просто с ума сойдёт, разбиравши ваши (казалось бы) логичные конструкции. Достаточно упомянуть такие языки, как Пестон и Похапэха, чтобы понять — ДАЛЕКО не каждому можно доверять создавать синтаксис(!!!!!!).

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

AA> C# прикладной язык, d — системный. Полноценное сравнение невозможно


Где вы нахватались этой ахинеи "системный", "прикладной"? В учебниках 70 г.в.? Всё, что мешает C# "писать операционки" — .NET runtime и отсутствие классов для обращения к аппаратуре. Равно как Ди никто не запрещает писать прикладуху (причём у Ди это получится даже лучше).

AA> Александреску никогда не скрывал, что дизайнил язык с оглядкой на питон


Бха-ха-ха!! слушай, ты эту траву сразу пачкой не кури — долго отпускает. Просто открой любой код на Ди и объясни сам себе, есть там хоть 10% сходства с пестоном!
Это не говоря уже о том, что дизайн языка — детище Уолтера, а тот создавал "улучшенный С++". Ты вообще хоть один абзац об истории Ди читал??
Re[2]: Семантика и выразительность языка
От: varenikAA  
Дата: 02.05.19 01:05
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>Здравствуйте, varenikAA, Вы писали:


AA>>А вам, семантика кого языка кажется более естественной для человеческого мышления?


K>Любая, кроме функциональной. Ну и мышление — глупо его сравнивать с крючками синтаксиса. Какой синтаксис выучил, на том и думаешь!


Не стоит недооценивать функциональщину. Система типов, паттерн-матчинг и прочее позволяют писать математически корректный код.
Это очень хорошо, т.к. программа должна не только работать, но еще делать это правильно.

AA>>Нужен ли языку расширяемый синтаксис или достаточно расширения на основе библиотек?


K>Это неправильный вопрос. Его неоднозначность в том, что в принципе язык можно и нужно улучшать наиболее простым способом. Тут Немерля прямо фаворит! Но прикол в том, что если ЛЮБОЙ будет лепить свои синтаксисы, посторонний кодер просто с ума сойдёт, разбиравши ваши (казалось бы) логичные конструкции. Достаточно упомянуть такие языки, как Пестон и Похапэха, чтобы понять — ДАЛЕКО не каждому можно доверять создавать синтаксис(!!!!!!).


Любой не будет, зря все этого боятся. я, например, окунулся в nemerle недавно, для расширения кругозора, но макросы пробовал писать только из любопытства, т.к. язык и так имеет очень много полезного, что покрывает 99% повседневных задач. Тоже самое говорят про лисп, но там тоже столько готовых макросов, что писать свой просто так мало какой новичок решится.

K>Рано или поздно язык должен прийти к единой форме, чтобы одного взгляда на код было достаточно для его понимания. Так что на "Нужен ли языку расширяемый синтаксис" ответа нет. Он как бы нужен, но под строгим контролем какой-нть конторы. И чтобы юзеры писали расширения, а наиболее удачные входили в язык по дефолту.


Этого не случится т.к. язык как и любая живая система все время развивается так как меняются взгляды и парадигмы. Когда ООП был на коне в C# были классы,
когда во всю заговорили о функциональщине, то MS пригласил спеца по хаскелю и вот все уже юзают linq и т.д.

AA>> C# прикладной язык, d — системный. Полноценное сравнение невозможно


K>Где вы нахватались этой ахинеи "системный", "прикладной"? В учебниках 70 г.в.? Всё, что мешает C# "писать операционки" — .NET runtime и отсутствие классов для обращения к аппаратуре. Равно как Ди никто не запрещает писать прикладуху (причём у Ди это получится даже лучше).


Не буду спорить, я не Линус Т.

AA>> Александреску никогда не скрывал, что дизайнил язык с оглядкой на питон


K>Бха-ха-ха!! слушай, ты эту траву сразу пачкой не кури — долго отпускает. Просто открой любой код на Ди и объясни сам себе, есть там хоть 10% сходства с пестоном!

K>Это не говоря уже о том, что дизайн языка — детище Уолтера, а тот создавал "улучшенный С++". Ты вообще хоть один абзац об истории Ди читал??

Читал, но Уолтер создавал первую версию. Александреску работал над второй.
Про ди могу сказать только хорошее, прочел книгу Александреску, даже пытался писать на ди,
но javascript, java, c, c++, php, python, c#! Пришлось выбирать меньшее из зол.
Кроме того, недавно видел реализацию паттерн-матчинга на ди, это конечно трешак (все еще к вопросу синтаксического расширения).
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: Семантика и выразительность языка
От: varenikAA  
Дата: 02.05.19 09:30
Оценка:
Здравствуйте, pagid, Вы писали:

P>Здравствуйте, varenikAA, Вы писали:


AA>>Почему нет?

P>Ну вот. А я то думал, что рассмотреть пример решения простой задачи на разных языках.

AA>>Форум для обмена инфой придуман.

P>Инфой о том как наиболее пространно и модно написать простую вещь? Возможно даже, что это интересное занятие, вот только для сравнения выразительности языков плохо подходит. Или как вариант, придется придумать задачу в которой применение таких средств оправдано, и эти средства делаею запись действительно выразительной.

Разве любое упрощение не является целью программирования?
Рич Хикки утверждает, что да, сложность исходного кода вот чего стремятся избежать при разработке.
Даже такой простой код можно написать проще на nemerle(для примера).
Теперь представьте, что вместо интов сложные объекты, ваш код начинает распухать и усложняться в прогрессии.
C# стандарт де-факто, но это не означает, что ненужно изучать другие ЯП.
Во-первых, знание это сила.
Во-вторых, программирование бывает не только коммерческим.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: Семантика и выразительность языка
От: pagid Россия  
Дата: 02.05.19 10:11
Оценка: +1
Здравствуйте, varenikAA, Вы писали:

AA>Разве любое упрощение не является целью программирования?

Но ты же пример на C# непонятно зачем то переусложнил. Занимался не программированием, а чем-то иным?
Re[2]: Семантика и выразительность языка
От: AlexRK  
Дата: 02.05.19 10:42
Оценка: +1
Здравствуйте, alexzzzz, Вы писали:

AA>>
AA>>using System;
AA>>using System.Linq;
AA>>using System.Collections.Generic;
AA>>class Program {
AA>>    static void Main(string[] args) {
AA>>        foreach (var e in Enumerable.Range(1, 10).Select((e, i) =>
AA>>              new { Index = i, Value = e }))
AA>>            if (e.Value % 2 == 0)
AA>>                Console.WriteLine($"{e.Index} = {e.Value}");
AA>>    }
AA>>}
AA>>

A>Ради чего это всё?

A>
class Program
A>{
A>    static void Main()
A>    {
A>        for (int i = 1; i <= 10; i++)
A>        {
A>            System.Console.WriteLine($"{i} = {i % 2 == 0}");
A>        }
A>    }
A>}



Предложенный вариант не эквивалентен первоначальному.

Вот этот эквивалентен:

class Program
{
    static void Main()
    {
        for (int i = 0, e = 1; e <= 10; i++, e++)
        {
            if (e % 2 == 0)
                System.Console.WriteLine($"{i} = {e}");
        }
    }
}
Re[3]: Семантика и выразительность языка
От: alexzzzz  
Дата: 02.05.19 12:32
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Предложенный вариант не эквивалентен первоначальному.


Знаю, но действительно не сразу заметил. Не вчитывался в код и сходу понял его неправильно. Следующий код делает то же самое, но понять его неправильно затруднительно:
class Program
{
    static void Main()
    {
        for (int i = 1; i <= 10; i += 2)
        {
            System.Console.WriteLine($"{i} = {i + 1}");
        }
    }
}
1 = 2
3 = 4
5 = 6
7 = 8
9 = 10
Re[6]: Семантика и выразительность языка
От: varenikAA  
Дата: 06.05.19 02:16
Оценка:
Здравствуйте, pagid, Вы писали:

P>Здравствуйте, varenikAA, Вы писали:


AA>>Разве любое упрощение не является целью программирования?

P>Но ты же пример на C# непонятно зачем то переусложнил. Занимался не программированием, а чем-то иным?

Почему переусложнил? Есть последовательность элементов, нужно выполнить над определенными элементами
какое-то действие, при этом еще нужно знать позицию в исходной коллекции.
В Nemerle это делается на уровни синтаксиса, как в естественном языке(код одновременно и императивный и декларативный!).
В C# потребовались дополнительные функции. Мне кажется, что данный пример отчетливо показывает разницу:
в одном языке открыты все возможности абстрагирования кода(благодаря полноценной поддержке ФункП и МетаП), в другом лишь то, что заложил автор и кода получается больше, а значит он становится сложней.
Вообще, удивительно как идея о полной открытости для расширения в Nemerle и CL кардинально меняют процесс
разработки. Так Nemerle.Peg генерирует чисто императивный процедурный код без ООП(со слов В.Ч.), а это однозначно более быстрый код — нежели генерация классов. При этом клиентский код сохраняет простоту необходимую
для поддержки и развития.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[7]: Семантика и выразительность языка
От: Ночной Смотрящий Россия  
Дата: 06.05.19 07:52
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Почему переусложнил? Есть последовательность элементов, нужно выполнить над определенными элементами

AA>какое-то действие, при этом еще нужно знать позицию в исходной коллекции.

Для этого есть Select с индексом.

AA>В Nemerle это делается на уровни синтаксиса, как в естественном языке(код одновременно и императивный и декларативный!).

AA>В C# потребовались дополнительные функции.

Зато в Немерле потребовалась куча наворотов для нормальной поддержки LINQ.

AA> Мне кажется, что данный пример отчетливо показывает разницу


Данный пример отчетливо показывает твое желание натянуть сову на глобус.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.