Добавлю к уже сказанному другими о множественных значениях.

Множественные результаты имеются в 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
<refal@botik.ru> wrote:
>
> > Так что Рефал Плюс — не единственный язык с коарность, или слово
> > «коарность» я понял не так.
>
> Понял так, как надо.
>
> > В языке Go функции тоже могут возвращать несколько значений:
> > https://ru.wikipedia.org/wiki/Go#Функции_могут_возвращать_несколько_значений
>
> Не знал, Да, сделано "как надо".
>
> > В Common Lisp’е функции могут возвращать несколько значений (и это не 
> > возврат списка):
> > http://lisper.ru/pcl/the-special-operators#Множественные значения
>
> Да, тоже не знал. Но, конечно, наворочено...
>
> > Языки, которые поддерживают кортежи, не считаются.  Ну можно вернуть
> > кортеж из нескольких значений, но это всё равно будет возврат одного
> > значения — кортежа, а не нескольких.
>
> В точку.  Можно эмулировть коарность (коместность) через картежи,
> списки, записи и другие подобные механизмы.  Например, Haskell:
> splitAt, divMod и т.д...
>
> А разница между эмуляцией и истинной коарностью в одном: при эмуляции
> два результата (несколько) конструктором упаковываются в одну
> стриктуру чтобы через мгновение разламывать эту структуру в точке
> приема на составные части (селекторы).
>
> Истинная коарность экономит на конструкторе и селекторах.
>
> Всего доброго,
>
> Сергей Абрамов
>
  • Re:... Boyko Bantchev boykobb_AT_gmail . com
  • Re[... Александр Гусев gusev_aleksandr_AT_mail . ru
  • RE:... Александр Коновалов a . v . konovalov87_AT_mail . ru
  • RE:... Александр Коновалов a . v . konovalov87_AT_mail . ru
  • Re[... Александр Гусев gusev_aleksandr_AT_mail . ru
  • Re:... Andrei Klimov andrei_AT_klimov . net
  • Re[... Александр Гусев gusev_aleksandr_AT_mail . ru
  • Re:... Sergei M. Abramov
  • RE:... Александр Коновалов a . v . konovalov87_AT_mail . ru
  • Re:... Sergei M. Abramov
  • Re:... Boyko Bantchev boykobb_AT_gmail . com
  • Re:... Eisymont Leonid verger-lk_AT_yandex . ru
  • RE:... Александр Коновалов a . v . konovalov87_AT_mail . ru
  • Re:... Eisymont Leonid verger-lk_AT_yandex . ru

Ответить