Могут ли все языковые конструкции быть первоклассными в языках с правилами офсайда? - PullRequest
2 голосов
/ 06 августа 2009

В LISP-подобных языках все языковые конструкции являются гражданами первого класса.

Рассмотрим следующий пример в Dylan:

let x = if (c)
          foo();
        else
          bar();
        end;

и в LISP:

(setf x (if c (foo) (bar)))

В Python вы должны написать:

if c:
    x = foo();
else:
    x = bar();

Поскольку Python выделяет операторы и выражения.

Могут ли все языковые конструкции на языке, который придерживается правила офсайда (имеет синтаксис на основе отступов), быть выражениями, чтобы вы могли назначать их переменным или передавать их в качестве параметров?

Ответы [ 2 ]

9 голосов
/ 06 августа 2009

Python имеет следующий синтаксис, который выполняет то же самое:

x = foo() if c else bar()
5 голосов
/ 06 августа 2009

Я не вижу здесь отношения с первоклассностью - вы передаете не * if оператор функции, а объект, который она возвращает, что является полностью первым классом в python как в лисп. Однако, что касается дихотомии оператор / выражение, очевидно, что это возможно: например, Haskell имеет синтаксис, основанный на отступах, хотя чисто функциональный язык явно не имеет операторов.

Я думаю, что разделение Python здесь больше связано с запретом опасных конструкций, таких как "if x = 4:" и т. Д., Чем с любым синтаксическим ограничением. (Хотя я думаю, что он теряет больше, чем получает от этого - иногда иметь гибкость, достаточную для того, чтобы оторвать ногу, очень ценно, даже если вы рискуете потерять несколько пальцев ног время от времени.)

...