Слишком много аргументов для функции - PullRequest
7 голосов
/ 30 декабря 2010

Я начинаю изучать Лисп с фоном Java.В упражнении SICP есть много заданий, в которых ученики должны создавать абстрактные функции со многими параметрами, например

 (define (filtered-accumulate combiner null-value term a next b filter)...)

в упражнении 1.33 .В Java (язык с безопасной, статической дисциплиной типизации) - метод с более чем 4 аргументами обычно пахнет, но в Lisp / Scheme это не так, не так ли?Мне интересно, сколько аргументов вы используете в своих функциях?Если вы используете его в производстве, вы делаете столько слоев?

1 Ответ

13 голосов
/ 30 декабря 2010

SICP использует подмножество Схемы

SICP - книга, используемая во вводном курсе информатики. Хотя он объясняет некоторые продвинутые концепции, он использует очень маленький язык, подмножество языка Scheme и подмножество любой реальной схемы или Lisp, которую предоставляет типичная реализация. Студенты, использующие SICP, должны начать с простого и легкого в изучении языка. Оттуда они учатся реализовывать более сложные языковые дополнения.

В простой образовательной схеме используются только позиционные параметры

Например, в SICP не разработано ни одного макроса. Добавьте, что стандартная схема имеет только позиционные параметры для функций.

Lisp и Scheme предлагают также более выразительные списки аргументов

В «реальном» Лиспе или Схеме можно использовать одно или несколько из следующего:

  • объекты или записи / структуры (замыкания бедняков), которые группируют вещи. Переданный объект может содержать несколько элементов данных, которые в противном случае должны были бы быть переданы «распространение».

  • по умолчанию для необязательных переменных. Таким образом, нам нужно только передать те, которые мы хотим иметь определенное значение не по умолчанию

  • необязательные и именованные аргументы. Это позволяет гибкие списки аргументов, которые являются гораздо более описательными.

  • вычисленные аргументы. Значение или значение аргументов по умолчанию может быть вычислено на основе других аргументов

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

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

Это также хороший стиль для любого нетривиального интерфейса, который предполагается использовать интерактивно пользователем / разработчиком для проверки своих аргументов во время выполнения.

Пример сложного, но удобочитаемого списка аргументов

Когда есть больше аргументов, Common Lisp предоставляет именованные аргументы, которые могут появляться в любом порядке после нормального аргумента. Именованные аргументы также предоставляют значения по умолчанию и могут быть опущены:

(defun order-product (product
                      &key
                      buyer
                      seller
                      (vat   (local-vat seller))
                      (price (best-price product))
                      amount
                      free-delivery-p)
  "The function ORDER-PRODUCT ..."   ; documentation string
  (declare (type ratio vat price)    ; type declarations
           (type (integer 0) amount)
           (type boolean free-delivery-p))
  ...)

Тогда мы бы использовали это:

(order-product 'sicp
               :seller 'mit-press
               :buyer  'stan-kurilin
               :amount  1)

Выше используется аргумент seller перед аргументом buyer. Он также пропускает различные аргументы, для некоторых из которых вычисляются их значения.

Теперь мы можем спросить, хороши ли такие аргументы или нет. Аргументы за них:

  • вызов функции становится более информативным
  • функции имеют стандартные механизмы для прикрепления документации
  • функции могут быть запрошены для их списков параметров
  • объявления типов возможны -> таким образом, типы не должны быть записаны как комментарии
  • многие параметры могут иметь разумные значения по умолчанию и не должны упоминаться

Несколько реализаций Scheme приняли похожие списки аргументов.

...