Re[8]: lambda являются first class citizens?
От: kov_serg Россия  
Дата: 14.05.18 16:10
Оценка:
Здравствуйте, uzhas, Вы писали:

U>да: https://wandbox.org/permlink/oEFfJUfH0z0CuoBh

U>твой тернарный оператор не имеет никакого отношения к first-class. иди вики почитай уже или внятно объясни, где ты видишь несостыковки с понятием first-class

Michael L. Scott, Programming Language Pragmatics, 3-rd ed., ELSEVIER 2011
ISBN 13: 978-0-12-374514-9

Page:154

3.6.2 First-Class Values and Unlimited Extent

In general, a value in a programming language is said to have
first-class status if it can be passed as a parameter, returned from a subroutine, or assigned into a variable.
Simple types such as integers and characters are first-class values in most programming languages.
By contrast, a
“second-class” value can be passed as a parameter, but not returned from a subroutine or assigned into a variable,
and a
“third-class” value cannot even be passed as a parameter.

Делаем виртуальнкю функцию, которая принимает лямду как параметр и в зависимости от того совпала она с предыдущим значением которое передавали в эту функцию
возвращает лямду 1 или лямду 2.
struct A {
  lambda prev;
  virtual lambda fn( lambda a ) {
    if (a==prev) return []{ one };
    prev=a;
    return []{ two };
  }
};

Для first class int это выглядит так:
struct A {
  int prev;
  virtual int fn(int a) {
    if (a==prev) return 1;
    prev=a;
    return 2;
  }
};


U>"мне неудобно" — это не обоснование, т.к. first-class не об удобстве, а о возможностях. плюсовые лямбды предоставляют те возможности, которые прописаны для first-class объектов (пусть даже и неудобно кому-то). если быть точнее, то лямбды соответствуют тем критериям\условиям, которые определены для всех first-class объектов


U>это всё равно, что заявлять, что обработка double не соответствует IEEE754. т.к. при печати 0.1 выдаётся куча девяток после запятой. ну да, кому-то неудобно, но это не значит, что double не соответствует стандарту IEEE

U>короче, с логикой явные проблемы
Я имел ввиду что это выглядит так как если бы для char приходилось писать
 char r = flag ? (double) char(65) : (double) char(48);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.