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

Одним из стилистических «соглашений», которые я нахожу слегка раздражающим в опубликованном коде, является использование:

if(condition) {

вместо (мои предпочтения):

if (condition) {

Небольшая разница, и, возможно, незначительная, но мне пришло в голову, что первый стиль может быть оправдан, если операторы if были реализованы как вызов функции. Тогда я мог бы перестать возражать против этого.

Кто-нибудь знает язык программирования, где оператор if реализован как вызов функции, где аргумент является единственным логическим выражением?

РЕДАКТИРОВАТЬ: Я понимаю, что блоки, следующие за if (), проблематичны, и способ, которым я выразил свой вопрос, был, вероятно, слишком наивным, но ответы до сих пор меня радуют.

Ответы [ 6 ]

1 голос
/ 15 января 2010

tcl - это один язык, который реализует if как обычную встроенную функцию / команду, которая принимает два параметра; условие и код блока для выполнения

if {$vbl == 1} { puts "vbl is one" }

http://tmml.sourceforge.net/doc/tcl/if.html

Фактически все языковые конструкции в tcl (для цикла, цикла и т. Д.) Реализованы в виде команд / функций.

1 голос
/ 15 января 2010

Если функция if должна быть обычной, то она не может просто принять условие, ей нужно в качестве параметров выполнить блок кода в зависимости от того, оценивается ли условие как истинное или нет.

Прототип такой функции в C ++ может быть чем-то вроде

void custom_if(bool cond, void (*block)());

Эта функция может вызывать функцию блокировки или нет, в зависимости от cond.

В некоторых функциональных языках все намного проще. В Haskell простая функция, такая как:

if' True a _ = a
if' _ _ b = b

позволяет написать код, подобный следующему:

if' (1 == 1)
  (putStrLn "Here")
  (putStrLn "There")

, который всегда будет печатать здесь.

1 голос
/ 15 января 2010

В Smalltalk оператор if является своего рода вызовом функции - своего рода, конечно, полностью объектно-ориентированным способом, так что на самом деле это метод, а не свободная функция. Я не уверен, как это повлияет на ваше мышление о синтаксисе, поскольку синтаксис совершенно другой, выглядит так:

someBoolean
    ifTrue:  [ do_something ]
    ifFalse: [ do_something_else ]

Учитывая, что в нем вообще нет скобок, вы, вероятно, можете интерпретировать это как доказательство того, во что вы хотели верить. : -)

1 голос
/ 15 января 2010

Lisp's if имеет точно такой же синтаксис, как и любой другой макрос в языке (это не совсем функция, но разница минимальна): (if cond then else)

И предложения «then», и «else» остаются без оценки, если только условие не выберет их.

1 голос
/ 15 января 2010

Невозможно иметь аргумент single , так как он должен решить, какой путь к коду следовать, что должно быть сделано вне указанной функции. Для этого потребуются как минимум два аргумента, но три позволят выполнить условие «else».

0 голосов
/ 15 января 2010

Я не знаю ни одного языка, где if (условие) реализовано как обычный вызов функции, но Perl реализует try {} catch {} etc .. {} как вызовы функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...