LINUX.ORG.RU

Разыскивается ЯП

 ,


0

7

Три требования:

1) Параметризуемые модули;

2) Перегрузка арифметики для пользовательских типов;

3) Кастомные литералы (возможно через отдельный препроцессор).

Необязательно соблюдение всех трех, можно 1 и 2 или 2 и 3.

Под 1 и 3 подходит OCaml.

★★★★★

Последнее исправление: buddhist (всего исправлений: 1)

а чем не нравится окамль? препроцессор у него я помню повышенной упоротости, но с ним вполне можно было жить.

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

Я ошибся, у него 1 и 3 выполняются, но с 2 все очень печально и дико костыльно.

buddhist ★★★★★
() автор топика

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

anonymous
()
Ответ на: комментарий от anonymous

Хочется сразу сесть и решать свою задачу, а не пердолиться с написанием языка. Но, скорее всего, так и придется написать DSL.

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

<Что такое кастомные литералы? Пользовательские, очевидно жеж.

anonymous
()
Ответ на: комментарий от buddhist

Тогда под 2 и 3 может подойти Haskell. Для 2 нужно определить числовой тип. Для 3 взять Template Haskell. Пункт 1 можно было бы заменить при некоторых условиях на классы типов, семейства типов и функциональную зависимость типов, но это зависит от твоей задачи

dave ★★★★★
()

очевидный хацкель.

anonymous
()
Ответ на: комментарий от dave

Приведу пример задачи для 1: тип вроде biginteger, необходимо, чтобы пользователь соответствующего модуля мог сам указать основание системы счисления/тип для внутреннего представления цифр. При этом необходимо исключить возможность того, чтобы в одной программе были совместимые между собой типы с разными внутренними представлениями.

Возможно, я просто сильно загнался, но параметризуемые модули как в Ada или functor в SML/OCaml здесь подходят лучше всего.

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

Haskell. В GHC 8.2.1 будет Backpack, покрывающий п. 1. Релиз должен весьма скоро состояться.

Алсо, Scala может подойти.

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

Да похоже на обычные параметризуемые типы. Они есть почти во всех статически-типизированных языках сейчас

dave ★★★★★
()

Вброс? CL - 2 и 3.

den73 ★★★★★
()

2) Перегрузка арифметики для пользовательских типов;

ну это есть в питоне, про остальное хз

3) Кастомные литералы (возможно через отдельный препроцессор).

а пример можно ?

вообще, в каком-нибудь руби ЕМНИП операторы тоже объекты и их даже как аргументы можно передавать, но я не вдавался

Dred ★★★★★
()

1) Параметризуемые модули;

C++

2) Перегрузка арифметики для пользовательских типов;

C++

3) Кастомные литералы (возможно через отдельный препроцессор).

C++

anonymous
()
Ответ на: комментарий от Dred

а пример можно?

12s (получаем std::chrono::duration), 1.0i (получаем std::complex<double>).

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

a.my_fucking_great_addition_function(b)

ООП головного мозга и дискриминация b.

Почему не my_fucking_great_addition_function(a, b)?

anonymous
()
Ответ на: комментарий от slovazap

В C++ есть модули? В каком стандарте появились? Вроде тут все кричали, что их так и не запилили.

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

Нет и будут нескоро (вроде даже в 17 не будет)

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

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

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

Очевидно, тем, что при инстанцировании шаблонного модуля могут быть инстанцированы несколько шаблонных классов.

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

Спасибо, тоже учту. Пару лет не писал на нем, все забыл уже.

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

Ты об этом?

Если чесно, никогда не понимал необходимость делать такое (хоть я к ООП отношусь _очень_ прохладно, функциональшина мне больше по вкусу)

Но да, заглушку на стандартную функцию повесить таки придется...

? (shadow '+)

? (defgeneric + (a &rest b))

? (defmethod + ((a number) &rest b) (apply 'cl:+ a b))
? (+ 1 2)
3
? (+ 2 3 4)
9

? (defmethod + ((a string) &rest b) (apply #'cl:concatenate 'string a b))
? (+ "Hello" "World")
"HelloWorld"
? (+ "Hello" " cruel " "World")
"Hello cruel World"

? (defmethod + ((a vector) &rest b) (apply #'map 'vector 'cl:+ a b))
? (let ((v0 #(1 2 3)) (v1 #(4 5 6))) (+ v0 v1))
#(5 7 9)
timdorohin ★★★★
()
Последнее исправление: timdorohin (всего исправлений: 2)
Ответ на: комментарий от buddhist

Приведу пример задачи для 1: тип вроде biginteger, необходимо, чтобы пользователь соответствующего модуля мог сам указать основание системы счисления/тип для внутреннего представления цифр. При этом необходимо исключить возможность того, чтобы в одной программе были совместимые между собой типы с разными внутренними представлениями.

Мне нужны шаблоны модулей

Нет, тебе нужны обычные шаблоны классов.

biginteger<int, 10> a;
biginteger<long, 16> b;
a = b; // compile error
slovazap ★★★★★
()

Очевидный хаскелль. Таких извращений, каких можно наворотить в нем, больше ни один ЯП не осилит.

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

Нет, ну ОП'у нужны полезные извращения, а не изврат вообще. Впрочем, вам, наверное, лучше знать.

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

Они настолько извращены, что в стандартной библиотеке до сих пор нет функции trim для строк :( И это почти за 20 лет. Тут то и начинаются извращения, кто во что горазд, если не хочется использовать boost или qstring.

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

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

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

Тут можно развести холивар на тему, какое представление строкового типа является самым самым. Но мы этого делать не будем.

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