Обновить

Микрофичи, которые хотелось бы шире распространить в языках программирования

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели13K
Всего голосов 31: ↑27 и ↓4+36
Комментарии36

Комментарии 36

поддержку P-мониторов вроде можно занести в языки посредством специальных комментариев (1, 2). Только спеки тоже придётся программировать.

А из фичей конечно хотелось бы быстрые касты типов, как в jai.

foo : fn(x: i32, y: u12) { /* impl here */}

a : i32 = 34;
b : i32 = 35;

foo(a,b);         // oh noes. i32 не вмещается в u12
foo(a, xx b);     // привести тип автоматически
foo(a, b as u12); // ну или привести явно как в rust

инты произвольной длины как в Zig тоже кстати полезная штука.

Фичи, вокруг которых, в сущности, построен язык — поэтому постфактум добавить их невозможно. Таковы, например, ленивость в Haskell, проверка заимствований в Rust, т.д.

Очень сильно сказано, но в корне не верно.

И ленивость и проверка заимствований вполне реализуются (переатаскиваются) в другие языки как на уровне стандартов, так и в виде отдельных библиотек.

Только ломают весь существующий код

Только ломают весь существующий код

Это зависит от того, как встраивать. Комитет С++ придерживается обязательной обратной совместимости, тогда как переход на третью версию Python был более чем болезненным.

Да, поэтому в плюсах 10 способов выстрелить себе в ногу, делая одно и то же)

Как там кстати с переходом на UTF8 строки? Без агрессии, я просто уже не слежу. Имеется ввиду, чтобы strlen, strpos и прочие substr возвращали-принимали количество code points, а не байтов.

Имеется ввиду, чтобы strlen, strpos и прочие substr возвращали-принимали количество code points, а не байтов.

На кой, простите, чёрт?

На кой, простите, чёрт?

Например, чтобы можно было передать в substring() количество вырезаемых символов, не зная, сколько байт они занимают.

И зачем это может понадобиться?

Ну отобразите на досуге первые 10 символов UTF-8 строки (больше у вас допустим в поле не влезает)

Что такое "символ" в данном случае? Графема? А выше речь шла о кодепойнтах. Разбиение на кодепойнты никак вам не поможет отобразить 10 графем. И это не говоря о том, что даже в моноширинном шрифте графемы имеют разную ширину -- некоторые 1 знакоместо, а некоторые -- 2.

Под символами я имел ввиду кодпоинты, а под полем - поле бд, а не графическое представление:) Хотя и для графики других разумных вариантов кроме подсчёта кодпоинтов нет. Даже при подгонке по фактической ширине вы берёте всю строку, рисуете нужным шрифтом на виртуальном канвасе. измеряете влезло-не влезло и потом всё равно режете по кодпоинтам, а не по графемам и лигатурам.

Вот именно что нужна подгонка. Для подгонки нужно итерироваться по кодепойнтам, а для этого не нужно ничего из того, с чего начался разговор (strlen, strpos, substr), а нужно совсем другое.

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

Асинхронность и параллельность немного разные вещи.

Немного - ключевое слово. Задачи могут требовать параллельных или асинхронных действий, но с точки зрения кода все будет выглядеть одинаково. По крайней мере, в самом простом виде на джаве

Можно использовать не только названия two_words или TwoWords, но и two-words. Это проще пишется и проще читается.

А проще пишется и читается это про что? Про нижнее подчеркивание или тире?

Лично мне удобнее - тире, для нижнего подчеркивания нужно 2 нажатия клавиш, для тире - только одно.

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

Микрофичи, которые сделают ваш язык write-only

Так решается ужасающая проблема «невкладываемых кавычек», присущая строковым литералам. 

Эмм а если мне кровь из носу в строке нужно поиметь те же две квадратные скобки ]] , то как легко и просто это решается?


В lua можно дополнительно добавлять сколько угодго =

[=[ [[]] ]=] == " [[]] "

Так решается ужасающая проблема «невкладываемых кавычек», присущая строковым литералам.

Мне нравится решение в C# - raw string literals.

string singleLine = """Friends say "hello" as they pass by.""";

А если строка содержит три кавычки подряд, то просто увеличим количество ограничивающих кавычек.

string singleLine = """"Friends say """hello""" as they pass by."""";

Могут быть многострочными.

string multiLine = """
    "Hello World!" is typically the first program someone writes.
    """;

Отступы, кстати, для красоты - на результат не влияют.

Я, когда сочинял себе язык программирования, основываясь на oberon, придумывал, чтобы описание параметров функций-методов было вроде такого:

procedure proc(a: type=Integer, default=10, constant=true; b: type=String): 
  return=Bool, static=true, volatile=true <... еще какие-то параметры метода>
begin
...
end;

И договоренности для сахара

procedure proc(a: Integer, 10, constant; b: String): 
  Bool, static, volatile
begin
...
end;

Чтобы не как с си-подобных, справа налево парсить и разбирать в уме, а четко слева-направо, и для любого объекта, параметры через двоеточие и через запятую.

Еще пример для переменной:

var
  a: Integer, immutable; /* можно присваивать только один раз*/

А то вот в си и java разработка новых фич производится просто с такими мучениями, удивляешься. Например, добавление record для введения неизменяемости - для моей идеи просто для class добавилось еще одна характеристика immutable.

class Box: immutable;
begin 
   ...
end;

Ну и так далее, после двоеточния и через запятую можно просто и понятно описывать все характеристики: static, final, abstract, singleton.

procedure proc(a: Integer, 10, constant; b: String): Bool, static, volatilebegin...end;

Один в один Pascal (пример ниже). Только процедура по определению не возвращает результат. Для этого используется функция.

procedure Hello(Say: string);
begin
writeln('Привет, ', Say, '!');
end;

Таким образом, можно вместо  dict["employee_id"] написать dict[:employee_id].

О, объясните убогому, в чём преимущество символа перед строкой и почему вторая запись считается лучше. Я без сарказма спрашиваю.

irb(main):001> 'employee_id'.object_id
=> 10024
irb(main):002> 'employee_id'.object_id
=> 10504
irb(main):003> :employee_id.object_id
=> 57942284
irb(main):004> :employee_id.object_id
=> 57942284

Одинаковые символы это всегда один и тот же объект в памяти. Для строк (кроме замороженных) - инициализируется новый.

Кстати, символы могут и многословными:

irb(main):025> :'employee id'.class
=> Symbol

А в чём преимущество-то? Как можно выиграть от того, что одинаковый object_id у символов? И зачем вообще object_id?

В том, что не создаются новые (по сути ненужные) объекты и не расходуется лишняя память.

А почему это завязано на синтаксис? Так-то интернирование есть и в Java и в C#

Что именно завязано?

Синтаксис разный потому, что объявляются разные типы объектов. Символ это просто идентификатор, а строка это строка. Это не то же, что интернирование. Если я правильно понял, то тут это называется заморозкой:

irb(main):001> 'employee_id'.freeze.object_id
=> 9904
irb(main):002> 'employee_id'.freeze.object_id
=> 9904

Т.е. это нужно, чтобы память экономить. Не назвал бы это фишкой. Скорее вынужденная мера.

Проверил сейчас на Питоне, для коротких строк он это делает автоматически.

О, объясните убогому, в чём преимущество символа перед строкой и почему вторая запись считается лучше.

Это другой тип данных со своими функциями. Упрощённо можно рассматривать их как некое универсальное перечисление (enum). Есть ситуации, когда использование enum предпочтительнее, чем использование строк или чисел. И с символами так же.

Ещё более интересные качественные улучшения работы с числами предусмотрены в языке J ... Например, можно записать 5*sqrt(π) как 5p0.5.

Да он, автор оригинала, издевается. Либо это часть мотива "помянуть APL (J - это APL для обычной клавиатуры) каким-нибудь добрым словом, ибо Кеннет Айверсон одним из первых подумал об адаптации языков программирования к работе с массивами".

В APL была ненормальная идея, что всё надо записать в один символ. log - три буквы. ln - две буквы. - вот теперь нормально.

В языке Frink предусмотрен особый синтаксис для значений, означающих даты. Можно записать # 2001-08-12 #, и это будет означать дату 2001-08-12, а не писать чего-то столь неудобного как Date(2001, 8, 12) — тем самым сразу получив баг, поскольку месяцы начинаются с 0 (а дни — нет).

Такой же синтаксис дат есть и в менее экзотическом языке — Visual Basic .NET.

Зачем вообще хардкодить даты? Где это нужно, кроме разовых write-only скриптов?

И, кажется, его странно желать как новую фичу вместо какого-либо общего механизма. User-defined префиксы/суффиксы к строковым литералам, например.

В D шаблоны могут играть префиксов (some_template!"string literal") и uniform call syntax позволяет записывать вызов функции "как суффикс" ( "string literal".foo() или "string literal".foo с учётом, что "any function can be used like a property").

Я бы хотел распространения splatting/uncurrying, равно как и destructuring. Очень удобно, терпеть не могу тупую работу по копированию кучи одноимённых полей из структуры в структуру/аргументы функции.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Информация

Сайт
timeweb.cloud
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия
Представитель
Timeweb Cloud