Соответствующий массив и синтаксис функции - PullRequest
1 голос
/ 09 апреля 2009

Таким образом, идея массива и функции очень похожа с точки зрения черного ящика. Вы передаете входные значения и получаете выходное значение. Так лучше ли сохранять синтаксис массива и синтаксис функции одинаковым или лучше иметь различия?

, например

массив печати [0]

print func (0)

против

массив печати (0)

функция печати (0)

Ответы [ 4 ]

1 голос
/ 09 апреля 2009

Технически вы правы, они оба сопоставления, но в сознании большинства программистов есть различие: массивы сохраняют свои значения, а функции вычисляют их значения. Другими словами, (упрощенно) массивы оптимизированы для скорости, а функции оптимизированы для памяти. Я думаю, что это хорошее различие, которое нужно поддерживать.

0 голосов
/ 09 апреля 2009

Вы абсолютно правы. Массивы, а также Карты и Словари и, возможно, даже Объекты, по сути, являются функциями в математическом смысле. И действительно, существуют языки, которые рассматривают массивы как функции целых чисел, карты и словари как функции своих ключей, а объекты - как функции своих слотов. Два из этих языков: Scala и Clojure .

0 голосов
/ 09 апреля 2009

Ну, я думаю, что традиционно это происходит из синтаксиса C / Algol, где [] напрямую переводится в смещение памяти, тогда как () - гораздо более сложная процедура.

В некоторых более новых языках [] является универсальным индексированием для примитивных структур данных, например, к хешам в J обращаются через:

hash["Hello"];
array[0];

Я думаю, что полезно сохранять синтаксис index для отличного от синтаксиса аргумента.

0 голосов
/ 09 апреля 2009

Ruby делает некоторую путаницу - методы используют (), но массивы, хэши и лямбда-выражения (самое близкое, что ruby ​​имеет к функциям) могут использовать []. Вместе с ducktyping это означает, что вы можете передавать объект и передавать ему значения, используя [], не заботясь о том, является ли он предварительно вычисленным (массив), вычисляется каждый раз (лямбда-выражение) или вычисляется по мере необходимости и кэшируется (что сделано с хешем).

Другим примером, который объединяет оба, является Haskell. Насколько я помню, в язык не встроен синтаксис массива - доступ к индексам массива является вызовом функции и может использоваться как любая другая функция.

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

...