Передача параметров в схеме - PullRequest
3 голосов
/ 21 февраля 2010

Может кто-нибудь помочь мне разобраться в различных режимах передачи параметров в Схеме? Я знаю, что схема реализует передачу параметров по значению. Но как насчет других режимов?

Есть ли хорошая документация для передачи параметров в Схеме?

Ответы [ 2 ]

7 голосов
/ 21 февраля 2010

Схема имеет только вызовы функции по значению. Есть и другие альтернативы, которые могут быть реализованы в языке, но если вы новичок, то лучше даже не пробовать их на этом этапе. Если вы ищете способ передачи значений «по ссылке», то один из вариантов, который может это сделать, - использовать макросы, но вам действительно не следует туда идти. Вместо этого некоторые реализации Scheme, такие как PLT Scheme, предоставляют «значение коробки»: это своего рода контейнер, который используется следующим образом:

  • Вы создаете коробку, содержащую <something> с (box <something>)
  • Вы получаете значение, которое хранится в поле с (unbox <some-box>)
  • Вы меняете значение, хранящееся в ящике, с помощью (set-box! <some-box> <new-value>)

Учитывая эти два, вы можете использовать такие блочные объекты «по значению», но их содержимое на самом деле является справочным. Это очень похоже на C, где все значения (большинство, фактически) передаются по значению, но некоторые из этих значений могут быть указателями, которые вы можете изменять. Кстати, лучше избегать даже этого: в Схеме функциональное программирование является более распространенным выбором, и поэтому лучше начать с этого.

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

1 голос
/ 22 февраля 2010

Чтобы добавить немного больше ...

Четыре фундаментальных соглашения о передаче параметров: вызов по значению, вызов по ссылке, вызов по имени и вызов по необходимости. Схема, как «в основном функциональный» язык, опирается на вызов по значению; Переменные, однажды созданные, обычно не меняются. Остальные три соглашения довольно похожи, и вы все равно можете делать их в Схеме, передавая ваши значения в блоки (используя box и unbox), и блоки действуют как указатели на значения.

Как правило, если вы обнаружите, что вам нужно использовать вызов по ссылке в функции, вам, вероятно, следует переосмыслить способ реализации функции и сделать ее чисто функциональной. Изменение переменной после ее создания с помощью set! является «побочным эффектом» и обычно избегается в функциональном программировании.

...