RE: Нужна ли "Ленинская простота" в Рефале?
Добрый день всем! Я, похоже, нашёл подходящий термин. Бойко назвал Рефал _слаботипизированным_ языком, имея в виду то, что базовых типов мало и пользователь не может создавать новые типы. Но термин _слабая типизация_ (weak typing, синоним: нестрогая типизация) уже занят, означает, что компилятор допускает неявные преобразования между типами (вроде Math.sin("3.14")). Предлагаю применительно к Рефалу и вообще в подобном смысле использовать термин _бедная_ типизация. _Богатая типизация_ — типов много, пользователь может определять новые типы самыми разнообразными способами. _Бедная_ — ничего интересного с типами язык не даёт. Скажем, в древних Фортране-66 или Алголе-60 система типов была бедная — целые, вещественные и их массивы различных размерностей. В Паскале система типов богаче. В Алголе-68 ещё богаче (во всяком случае, интереснее). С уважением, Александр Коновалов -Original Message- From: Boyko Bantchev boykobb_AT_gmail.com Sent: Monday, December 2, 2019 1:13 AM To: refal@botik.ru Subject: Re: Нужна ли "Ленинская простота" в Рефале? > Распространённая терминологическая ошибка Александр, Представьте себе, мне хорошо известна разница между понятиями статическая/динамическая и строгая/нестрогая в отношении типизации в языках программирования. Однако я говорю не о нестрогой типизации, а о слабой. Слабо типизированным я называю язык, в котором, грубо говоря, типы данных имеют небольшую роль. Например, их мало и нельзя определять новые. Такой язык не обязательно нестрого типизированный. > Ликбез по типизациям: https://habr.com/ru/post/161205/ Спасибо за заботу. Адекватных источников, например книжек, хватит, я их читал и по мере сил стараюсь продолжать. > А с тем, что Рефал — динамически типизированный, я не спорю. Я и не утверждал то, с чем вы не спорите. Кстати, оно и неоднозначно, динамический Рефал или нет. Например, если считать типами s., t. и e., то Рефал окажется статически типизированным: тип каждой переменной определён в тексте программы, т.е. статически.
Re: Нужна ли "Ленинская простота" в Рефале?
О, спасибо! Получилось! пн, 2 дек. 2019 г. в 21:07, Александр Коновалов a.v.konovalov87_AT_mail.ru < refal@botik.ru>: > Добрый вечер, Аркадий! > > Его можно читать. Открываете ссылку в Internet Explorer, щёлкаете правой > кнопкой мыши, «Кодировка» → «Дополнительно» → «Кириллица (KOI8-R)». > > В браузерах Edge и Edge Dev (новый на движке Chromium) меню выбора > кодировки я не нашёл. Других браузеров у меня на компьютере не установлено, > подсказать настройки кодировки не смогу. > > > > С уважением, > Александр Коновалов > > > > *From:* Arkady Klimov arkady.klimov_AT_gmail.com [mailto:refal@botik.ru] > *Sent:* Monday, December 2, 2019 8:52 PM > *To:* refal@botik.ru > *Subject:* Re: Нужна ли "Ленинская простота" в Рефале? > > > > > > вс, 1 дек. 2019 г. в 21:18, Александр Коновалов a.v.konovalov87_AT_mail.ru > : > > > Статическая типизация Рефала обсуждалась в этой рассылке в незапамятные > времена (KOI8-R): > > https://mazdaywik.github.io/direct-link/refal-botik-ru/refal/0005.html > https://mazdaywik.github.io/direct-link/refal-botik-ru/refal/0007.html > https://mazdaywik.github.io/direct-link/refal-botik-ru/refal/0222.html > > Я давно уже хотел найти это свое письмо (первое - 0005). Есть ли > возможность его читать? > > Если у кого получилось, поделитесь опытом плз. > > Аркадий > -- ___ *С уважением, * *Аркадий Климов,* *с.н.с. ИППМ РАН,* *+7(499)135-32-95* *+7(916)072-81-48*
RE: Нужна ли "Ленинская простота" в Рефале?
Добрый вечер, Аркадий! Его можно читать. Открываете ссылку в Internet Explorer, щёлкаете правой кнопкой мыши, «Кодировка» → «Дополнительно» → «Кириллица (KOI8-R)». В браузерах Edge и Edge Dev (новый на движке Chromium) меню выбора кодировки я не нашёл. Других браузеров у меня на компьютере не установлено, подсказать настройки кодировки не смогу. С уважением, Александр Коновалов From: Arkady Klimov arkady.klimov_AT_gmail.com [mailto:refal@botik.ru] Sent: Monday, December 2, 2019 8:52 PM To: refal@botik.ru Subject: Re: Нужна ли "Ленинская простота" в Рефале? вс, 1 дек. 2019 г. в 21:18, Александр Коновалов a.v.konovalov87_AT_mail.ru <http://a.v.konovalov87_AT_mail.ru> mailto:refal@botik.ru> >: Статическая типизация Рефала обсуждалась в этой рассылке в незапамятные времена (KOI8-R): https://mazdaywik.github.io/direct-link/refal-botik-ru/refal/0005.html https://mazdaywik.github.io/direct-link/refal-botik-ru/refal/0007.html https://mazdaywik.github.io/direct-link/refal-botik-ru/refal/0222.html Я давно уже хотел найти это свое письмо (первое - 0005). Есть ли возможность его читать? Если у кого получилось, поделитесь опытом плз. Аркадий
Re: Нужна ли "Ленинская простота" в Рефале?
Добавлю к уже сказанному другими о множественных значениях. Множественные результаты имеются в Scheme и с ними работается сравнительно удобно. Например, одна и та же функция может возвращать разное количество результатов в разных случаях. Функция ниже находит корни квадратного уравнения, реальные или комплексные, и возвращает их как два значения. Но если они совпадают, возвращается единственное значение.O`` (define [roots a b c] (let ([d (sqrt (- (* b b) (* 4 a c)))] [a2 (* 2 a)]) (if (= 0 d) (- (/ b a2)) (values (/ (- (+ b d)) a2) (/ (- d b) a2) (roots 1 -3 2) ; получаем два значения: 1 и 2 (roots 1 6 9); получаем значение –3 Множественное присваивание и множественные результаты имеются в языке CLU (середины 70-х) — он более-менее забыт, но дал начало многим конструкциям в современных ЯП. В CLU, например, имеется цикл вида for x,y,z in итератор(аргументы) do тело-цикла где итератор — ограниченного вида сопрограмма, возвращающая некоторое количество значений, которыми питается цикл. Язык Lua также отлично поддерживает множественное присваивание, множественные результаты и циклы как выше у CLU, только с бо́льшими возможностями. (Вообще, в этом языке — удивительно богатый набор возможностей в микроскопическом объёме реализации. Настоящая жемчужина!) On Mon, 2 Dec 2019 at 18:29, Sergei M. Abramov abram_AT_botik.ru wrote: > > > Так что Рефал Плюс — не единственный язык с коарность, или слово > > «коарность» я понял не так. > > Понял так, как надо. > > > В языке Go функции тоже могут возвращать несколько значений: > > https://ru.wikipedia.org/wiki/Go#Функции_могут_возвращать_несколько_значений > > Не знал, Да, сделано "как надо". > > > В Common Lisp’е функции могут возвращать несколько значений (и это не > > возврат списка): > > http://lisper.ru/pcl/the-special-operators#Множественные значения > > Да, тоже не знал. Но, конечно, наворочено... > > > Языки, которые поддерживают кортежи, не считаются. Ну можно вернуть > > кортеж из нескольких значений, но это всё равно будет возврат одного > > значения — кортежа, а не нескольких. > > В точку. Можно эмулировть коарность (коместность) через картежи, > списки, записи и другие подобные механизмы. Например, Haskell: > splitAt, divMod и т.д... > > А разница между эмуляцией и истинной коарностью в одном: при эмуляции > два результата (несколько) конструктором упаковываются в одну > стриктуру чтобы через мгновение разламывать эту структуру в точке > приема на составные части (селекторы). > > Истинная коарность экономит на конструкторе и селекторах. > > Всего доброго, > > Сергей Абрамов >
Re: Нужна ли "Ленинская простота" в Рефале?
вс, 1 дек. 2019 г. в 21:18, Александр Коновалов a.v.konovalov87_AT_mail.ru < refal@botik.ru>: > > Статическая типизация Рефала обсуждалась в этой рассылке в незапамятные > времена (KOI8-R): > > https://mazdaywik.github.io/direct-link/refal-botik-ru/refal/0005.html > https://mazdaywik.github.io/direct-link/refal-botik-ru/refal/0007.html > https://mazdaywik.github.io/direct-link/refal-botik-ru/refal/0222.html > > Я давно уже хотел найти это свое письмо (первое - 0005). Есть ли возможность его читать? Если у кого получилось, поделитесь опытом плз. Аркадий
Re: Нужна ли "Ленинская простота" в Рефале?
> Так что Рефал Плюс — не единственный язык с коарность, или слово > «коарность» я понял не так. Понял так, как надо. > В языке Go функции тоже могут возвращать несколько значений: > https://ru.wikipedia.org/wiki/Go#Функции_могут_возвращать_несколько_значений Не знал, Да, сделано "как надо". > В Common Lisp’е функции могут возвращать несколько значений (и это не возврат > списка): > http://lisper.ru/pcl/the-special-operators#Множественные значения Да, тоже не знал. Но, конечно, наворочено... > Языки, которые поддерживают кортежи, не считаются. Ну можно вернуть > кортеж из нескольких значений, но это всё равно будет возврат одного > значения — кортежа, а не нескольких. В точку. Можно эмулировть коарность (коместность) через картежи, списки, записи и другие подобные механизмы. Например, Haskell: splitAt, divMod и т.д... А разница между эмуляцией и истинной коарностью в одном: при эмуляции два результата (несколько) конструктором упаковываются в одну стриктуру чтобы через мгновение разламывать эту структуру в точке приема на составные части (селекторы). Истинная коарность экономит на конструкторе и селекторах. Всего доброго, Сергей Абрамов
RE: Нужна ли "Ленинская простота" в Рефале?
Добрый вечер, Сергей! «А это было не так. И первая (минимальная не пустая) „неподвижная точка“ — Рефал Плюс.» Рефал-4 замкнут только относительно прогонки. А Рефал Плюс — ещё и относительно разрезания стека (ибо коместность). «Рефал Плюс единственный из Рефалов с коарностью (если даже не единственный язык программирования с коарностью в мире).» В Common Lisp’е функции могут возвращать несколько значений (и это не возврат списка): http://lisper.ru/pcl/the-special-operators#Множественные значения Механизм, конечно, извращённый, но тем не менее, функция возвращает несколько значений. В языке Go функции тоже могут возвращать несколько значений: https://ru.wikipedia.org/wiki/Go#Функции_могут_возвращать_несколько_значений Языки, которые поддерживают кортежи, не считаются. Ну можно вернуть кортеж из нескольких значений, но это всё равно будет возврат одного значения — кортежа, а не нескольких. В Go нет кортежей, но множественный возврат есть. Так что Рефал Плюс — не единственный язык с коарность, или слово «коарность» я понял не так. С уважением, Александр Коновалов -Original Message- From: Sergei M. Abramov abram_AT_botik.ru Sent: Monday, December 2, 2019 5:34 PM To: Александр Коновалов a.v.konovalov87_AT_mail.ru Subject: Re: Нужна ли "Ленинская простота" в Рефале? День добрый, всем! > «Постепенно, по мере усложнения задач, возникли желания по оптимизации > и оказалось, что проще вводить новые конструкции в язык, чем > интеллектуализировать исполнение программы изнутри.» > Не понял мысль. Речь о каких новых конструкциях? Ох, для меня важнее другая мотивация: я ее писал и она просто отслеживается в статьях С.А.Ромяненко: 1. Рефал задумывался как метаязык. 2. Результат метавычислений над Рефалом должен естественно изобрабаться на Рефале. А это было не так. И первая (минимальная не пустая) "неподвижная точка" -- Рефал Плюс. PS. Конечно попросят примеров. Напомню один: суперкомпиляция с рассечением стеков пораждает функции с коарностью. Рефал Плюс едиснтвенный из Рефалов с коарностью (если дабе не единственный язык программирования с коарностью в мире). Всего доброго, Сергей Абрамов
Re: Нужна ли "Ленинская простота" в Рефале?
День добрый, всем! > «Постепенно, по мере усложнения задач, возникли желания по > оптимизации и оказалось, что проще вводить новые конструкции в язык, > чем интеллектуализировать исполнение программы изнутри.» > Не понял мысль. Речь о каких новых конструкциях? Ох, для меня важнее другая мотивация: я ее писал и она просто отслеживается в статьях С.А.Ромяненко: 1. Рефал задумывался как метаязык. 2. Результат метавычислений над Рефалом должен естественно изобрабаться на Рефале. А это было не так. И первая (минимальная не пустая) "неподвижная точка" -- Рефал Плюс. PS. Конечно попросят примеров. Напомню один: суперкомпиляция с рассечением стеков пораждает функции с коарностью. Рефал Плюс едиснтвенный из Рефалов с коарностью (если дабе не единственный язык программирования с коарностью в мире). Всего доброго, Сергей Абрамов
Re: Нужна ли "Ленинская простота" в Рефале?
> Распространённая терминологическая ошибка Александр, Представьте себе, мне хорошо известна разница между понятиями статическая/динамическая и строгая/нестрогая в отношении типизации в языках программирования. Однако я говорю не о нестрогой типизации, а о слабой. Слабо типизированным я называю язык, в котором, грубо говоря, типы данных имеют небольшую роль. Например, их мало и нельзя определять новые. Такой язык не обязательно нестрого типизированный. > Ликбез по типизациям: https://habr.com/ru/post/161205/ Спасибо за заботу. Адекватных источников, например книжек, хватит, я их читал и по мере сил стараюсь продолжать. > А с тем, что Рефал — динамически типизированный, я не спорю. Я и не утверждал то, с чем вы не спорите. Кстати, оно и неоднозначно, динамический Рефал или нет. Например, если считать типами s., t. и e., то Рефал окажется статически типизированным: тип каждой переменной определён в тексте программы, т.е. статически.
RE: Нужна ли "Ленинская простота" в Рефале?
Добрый вечер, Бойко! «Рефал ведь слабо типизированный язык…» Распространённая терминологическая ошибка, перепутана слабая и динамическая типизация. Сильно типизированный язык — язык, запрещающий неявные преобразования. Слабо типизированный язык — язык, разрешающий неявные преобразования. JavaScript — слабо типизированный язык, поскольку в нём можно сложить строку с числом. А Рефал — сильно типизированный язык, в нём нет неявных преобразований. Число 0 может сопоставиться только с образцом 0, а не '0' (character) или "0" (составной символ). А с тем, что Рефал — динамически типизированный, я не спорю. Есть зачаток статической типизации в Рефале Плюс — форматы функций, но это только зачаток. Ликбез по типизациям: https://habr.com/ru/post/161205/ Хорошая статическая типизация для Рефала даже первого порядка — интересная задача. Надеюсь, когда-нибудь решу. Статическая типизация Рефала обсуждалась в этой рассылке в незапамятные времена (KOI8-R): https://mazdaywik.github.io/direct-link/refal-botik-ru/refal/0005.html https://mazdaywik.github.io/direct-link/refal-botik-ru/refal/0007.html https://mazdaywik.github.io/direct-link/refal-botik-ru/refal/0222.html «А избежание необходимости усложнений Рефала, на мой взгляд, можно постичь, если реализовать небольшое его подмножество в виде библиотеки на ANSI C.» ИМХО тут надо брать пример с Lua. С уважением, Александр Коновалов -Original Message- From: Boyko Bantchev boykobb_AT_gmail.com [mailto:refal@botik.ru] Sent: Sunday, December 1, 2019 12:52 PM To: Александр Гусев ; refal@botik.ru Subject: Re: Нужна ли "Ленинская простота" в Рефале? > ... Если ещё немного усложнить язык - получится Хаскелл, зачем тогда Рефал? Получить Haskell или вообще язык с системой типов Hindley–Milner из Рефала не то что с небольшими усложнениями, а вообще нереально ожидать. Рефал ведь слабо типизированнъй язык, тогда как с Hindley–Milner-овскими языками как раз наоборот. И механизмы сопоставления у Рефала и у Hindley–Milner-а совсем разные. У каждого свои преимущества. А избежание необходимости усложнений Рефала, на мой взгляд, можно постичь, если реализовать небольшое его подмножество в виде библиотеки на ANSI C. Это даст, с одной стороны, компилятор, интерпретатор и REPL этого минимального и совсем простого Рефала для непосредственных применений, в том числе для изучения, обучения и всяких хобби занятий. С другой стороны, через интерфейс к ANSI C будет обеспечена возможность сочетать программирование на Рефале с программированием на почти любом другом языке. На этих других языках, а не в самом Рефале, и будут реализоваться все желательные языковые расширения. И то, и другое увеличило бы, помимо прочего, практическую доступность Рефала. Зависимости от операционной системы, например, вообще не будет — одна реализация языка на все системы, где есть C. Ещё одна возможность — реализовать тот самый небольшой Рефал в виде библиотеки на JavaScript, что обеспечило бы применимость и в вебприложениях, и (через Node) во многих других. Может, я что-то упускаю из вида, но именно такой путь развития Рефала мне кажется очень перспективным.
Re: Нужна ли "Ленинская простота" в Рефале?
> ... Если ещё немного усложнить язык - получится Хаскелл, зачем тогда Рефал? Получить Haskell или вообще язык с системой типов Hindley–Milner из Рефала не то что с небольшими усложнениями, а вообще нереально ожидать. Рефал ведь слабо типизированнъй язык, тогда как с Hindley–Milner-овскими языками как раз наоборот. И механизмы сопоставления у Рефала и у Hindley–Milner-а совсем разные. У каждого свои преимущества. А избежание необходимости усложнений Рефала, на мой взгляд, можно постичь, если реализовать небольшое его подмножество в виде библиотеки на ANSI C. Это даст, с одной стороны, компилятор, интерпретатор и REPL этого минимального и совсем простого Рефала для непосредственных применений, в том числе для изучения, обучения и всяких хобби занятий. С другой стороны, через интерфейс к ANSI C будет обеспечена возможность сочетать программирование на Рефале с программированием на почти любом другом языке. На этих других языках, а не в самом Рефале, и будут реализоваться все желательные языковые расширения. И то, и другое увеличило бы, помимо прочего, практическую доступность Рефала. Зависимости от операционной системы, например, вообще не будет — одна реализация языка на все системы, где есть C. Ещё одна возможность — реализовать тот самый небольшой Рефал в виде библиотеки на JavaScript, что обеспечило бы применимость и в вебприложениях, и (через Node) во многих других. Может, я что-то упускаю из вида, но именно такой путь развития Рефала мне кажется очень перспективным.