RE: Нужна ли "Ленинская простота" в Рефале?

2019-12-03 Пенетрантность Александр Коновалов a . v . konovalov87_AT_mail . ru
Добрый день всем!

Я, похоже, нашёл подходящий термин. Бойко назвал Рефал _слаботипизированным_ 
языком, имея в виду то, что базовых типов мало и пользователь не может 
создавать новые типы. Но термин _слабая типизация_ (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: Нужна ли "Ленинская простота" в Рефале?

2019-12-02 Пенетрантность Arkady Klimov arkady . klimov_AT_gmail . com
О, спасибо! Получилось!

пн, 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: Нужна ли "Ленинская простота" в Рефале?

2019-12-02 Пенетрантность Александр Коновалов a . v . konovalov87_AT_mail . 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 
<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: Нужна ли "Ленинская простота" в Рефале?

2019-12-02 Пенетрантность Boyko Bantchev boykobb_AT_gmail . com
Добавлю к уже сказанному другими о множественных значениях.

Множественные результаты имеются в 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: Нужна ли "Ленинская простота" в Рефале?

2019-12-02 Пенетрантность Arkady Klimov arkady . klimov_AT_gmail . com
вс, 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: Нужна ли "Ленинская простота" в Рефале?

2019-12-02 Пенетрантность Sergei M. Abramov
> Так что Рефал Плюс — не единственный язык с коарность, или слово
> «коарность» я понял не так.

Понял так, как надо.

> В языке Go функции тоже могут возвращать несколько значений:
> https://ru.wikipedia.org/wiki/Go#Функции_могут_возвращать_несколько_значений

Не знал, Да, сделано "как надо".

> В Common Lisp’е функции могут возвращать несколько значений (и это не возврат 
> списка):
> http://lisper.ru/pcl/the-special-operators#Множественные значения

Да, тоже не знал. Но, конечно, наворочено...

> Языки, которые поддерживают кортежи, не считаются.  Ну можно вернуть
> кортеж из нескольких значений, но это всё равно будет возврат одного
> значения — кортежа, а не нескольких.

В точку.  Можно эмулировть коарность (коместность) через картежи,
списки, записи и другие подобные механизмы.  Например, Haskell:
splitAt, divMod и т.д...

А разница между эмуляцией и истинной коарностью в одном: при эмуляции
два результата (несколько) конструктором упаковываются в одну
стриктуру чтобы через мгновение разламывать эту структуру в точке
приема на составные части (селекторы).

Истинная коарность экономит на конструкторе и селекторах.

Всего доброго,

Сергей Абрамов



RE: Нужна ли "Ленинская простота" в Рефале?

2019-12-02 Пенетрантность Александр Коновалов a . v . konovalov87_AT_mail . ru
Добрый вечер, Сергей!

«А это было не так. И первая (минимальная не пустая) „неподвижная точка“ — 
Рефал Плюс.»

Рефал-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: Нужна ли "Ленинская простота" в Рефале?

2019-12-02 Пенетрантность Sergei M. Abramov
День добрый, всем!

> «Постепенно, по мере усложнения задач, возникли желания по
> оптимизации и оказалось, что проще вводить новые конструкции в язык,
> чем интеллектуализировать исполнение программы изнутри.»

> Не понял мысль. Речь о каких новых конструкциях?

Ох, для меня важнее другая мотивация: я ее писал и она просто
отслеживается в статьях С.А.Ромяненко:

1. Рефал задумывался как метаязык.

2. Результат метавычислений над Рефалом должен естественно
изобрабаться на Рефале.

А это было не так.  И первая (минимальная не пустая) "неподвижная
точка" -- Рефал Плюс.

PS. Конечно попросят примеров. Напомню один: суперкомпиляция с
рассечением стеков пораждает функции с коарностью.  Рефал Плюс
едиснтвенный из Рефалов с коарностью (если дабе не единственный язык
программирования с коарностью в мире).

Всего доброго,

Сергей Абрамов



Re: Нужна ли "Ленинская простота" в Рефале?

2019-12-01 Пенетрантность Boyko Bantchev boykobb_AT_gmail . com
> Распространённая терминологическая ошибка 

Александр,

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

> Ликбез по типизациям: https://habr.com/ru/post/161205/

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

> А с тем, что Рефал — динамически типизированный, я не спорю.

Я и не утверждал то, с чем вы не спорите.
Кстати, оно и неоднозначно, динамический Рефал или нет.  Например,
если считать типами s., t. и e., то Рефал окажется статически
типизированным: тип каждой переменной определён в тексте программы,
т.е. статически.


RE: Нужна ли "Ленинская простота" в Рефале?

2019-12-01 Пенетрантность Александр Коновалов a . v . konovalov87_AT_mail . ru
Добрый вечер, Бойко!

«Рефал ведь слабо типизированный язык…»

Распространённая терминологическая ошибка, перепутана слабая и динамическая 
типизация.

Сильно типизированный язык — язык, запрещающий неявные преобразования. Слабо 
типизированный язык — язык, разрешающий неявные преобразования. 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: Нужна ли "Ленинская простота" в Рефале?

2019-12-01 Пенетрантность Boyko Bantchev boykobb_AT_gmail . com
> ... Если ещё немного усложнить язык - получится Хаскелл, зачем тогда Рефал?

Получить Haskell или вообще язык с системой типов Hindley–Milner
из Рефала не то что с небольшими усложнениями, а вообще нереально
ожидать.  Рефал ведь слабо типизированнъй язык, тогда как с
Hindley–Milner-овскими языками как раз наоборот.  И механизмы
сопоставления у Рефала и у Hindley–Milner-а совсем разные.
У каждого свои преимущества.

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

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

Ещё одна возможность — реализовать тот самый небольшой Рефал в
виде библиотеки на JavaScript, что обеспечило бы применимость и в
вебприложениях, и (через Node) во многих других.

Может, я что-то упускаю из вида, но именно такой путь развития Рефала
мне кажется очень перспективным.