языки с функциями, которые не нуждаются в скобках? - PullRequest
3 голосов
/ 07 июня 2009

IIRC, vb6 разрешены вызовы функций без (). IIRC, это разрешалось всякий раз, когда у func не было возвращаемого значения, и вы всегда могли использовать func (то же, params, здесь).

Какие другие языки позволяют это? Как вы думаете, что должно означать func без скобок? Какие у них правила?

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

Ответы [ 15 ]

5 голосов
/ 07 июня 2009

Практически все функциональные языки линии ML (Miranda, Haskell, OCML, F #, SML и т. Д.) Не требуют скобок для вызовов функций.

Например, в Haskell:

Prelude> (\x->x) 1
1

Функция анонимной идентификации вызывается с 1 и возвращает 1

3 голосов
/ 07 июня 2009

В функциональных языках программирования (ML, Haskell, F #, OCAML) любая функция имеет только один аргумент - многопараметрические функции представлены передачей кортежей или Curry . Таким образом, нет необходимости для функции заключать параметр в скобки.

Пример № 1:

inc x = x + 1
res = inc 42

Пример № 2:

sum a b = a + b
res = sum 1 2 

В # 2 вы передаете 1 в sum и затем вызываете полученную функцию с помощью 2 (Curry)

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

Просто сравните два примера.

a = f(g x)
b = f $ g x

print(square(parse "Hello"))
"Hello" |> parse |> square |> print

Другим способом сокращения скобок в других языках является введение методов расширения (аналогично конвейерам) или оператора стрелки.

Сравнить:

ToString(Parse(42))
"42".Parse().ToString()

(*(*SomePointer).SomeMember).Invoke();
SomePointer->SomeMember->Invoke();

Ruby и Perl позволяют вызывать подпрограммы без скобок, языки в стиле VBC (Visual Basic, VBScript) тоже делают это. Lisp / Scheme также не нуждаются в скобках для своих вызовов функций (но в любом случае есть много скобок ^^)

3 голосов
/ 07 июня 2009

рубин

def hello_world name
   puts "Hello world, #{name}."
end

hello_world 'Hal'

Если вы хотите, вы можете , но вы не обязаны использовать круглые скобки, и это здорово в тех случаях, когда это повышает читабельность и уменьшает неопределенность.

3 голосов
/ 07 июня 2009

Tcl

puts "Hello, world!"
2 голосов
/ 07 июня 2009

Perl и Smalltalk - пара примеров. (Обратите внимание, что оба допускают парантезы, но они не требуют их во всех ситуациях.)

1 голос
/ 02 февраля 2016

Coffeescript - отличный язык, который компилируется в Javascript и не требует скобок, даже для вложенных вызовов методов.

Например:

y = Math.pow 10, Math.floor Math.log10 x

становится:

var y = Math.pow(10, Math.floor(Math.log10(x)));
1 голос
/ 07 июня 2009

Forth

: STAR          [CHAR] * EMIT ;
: STARS         0 DO STAR LOOP CR ;
: SQUARE        DUP 0 DO DUP STARS LOOP DROP ;
: TRIANGLE      1 DO I STARS LOOP ;
: TOWER ( n -- )  DUP TRIANGLE SQUARE ;

Скобки - комментарии.

1 голос
/ 07 июня 2009

JavaScript - это пример того, что может означать функция «вызов» без скобок: ссылка. В языках, которые позволяют рассматривать функции как объекты, имя функции - это просто другая переменная.

Кроме того, в языковых конструкциях PHP (таких как echo или exit) не нужны скобки, даже если они принимают аргументы, поэтому «echo $ foo» означает то же, что «echo ($ foo)» и «exit $ foo» так же, как "выход ($ foo)".

1 голос
/ 07 июня 2009

Ruby - это другой язык, который позволяет, но не требует (в большинстве случаев), скобок при вызове методов.

Они также необязательны при определении метода.

def say_hi your_name
  puts "Hello, #{your_name}!"
end

Когда метод является аргументом для другого метода, Ruby 1.8. * Выдает предупреждение о необходимости скобок в будущей версии. Попробуйте разобраться в этом, затем попробуйте в irb:

puts "guess what this does?".slice 6, 4
1 голос
/ 07 июня 2009

F # не нуждается в параметрах - особенно при использовании оператора конвейера.

a(b(c(d(10)))) ;;

эквивалентно:

10 |> d |> c |> b |> a ;;

(эффект, действительно похожий на методы расширения)


В Ruby скобки всегда являются необязательными (аналогично VB), но в Ruby они даже необязательны, когда объявляет метод:

def echo( foo )
    return foo
end

идентичен:

def echo foo
    return foo
end
...