Почему используют код короткого замыкания?

Язык Common LISP

я абсолютно уверен, что это могло быть большим количеством effieicnet. Это - моя первая функция шепелявости кроме "привет, мир" и вводящий в примере кода в третьей главе. Практический язык Common LISP является большим текстом. Эта функция, действительно кажется, обрабатывает большие факториалы хорошо.

(defun factorial (x)
  (if (< x 2) (return-from factorial (print 1)))
  (let ((tempx 1) (ans 1))
  (loop until (equalp x tempx) do
       (incf tempx)
       (setf ans (* tempx ans)))
  (list ans)))
5
задан Community 23 May 2017 в 10:25
поделиться

8 ответов

Для программистов преимущество менее подробного синтаксиса по сравнению с другим более подробным синтаксисом может заключаться в следующем:

  • меньше набирать, следовательно, выше эффективность кодирования,
  • меньше читать, а значит, удобнее.

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

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

  • анонимные внутренние классы в Java вместо передачи указателя на функцию (намного больше строк кода).
  • в Ruby, оператор || =, чтобы оценить выражение и присвоить ему значение, если оно имеет значение false или null. Конечно, вы можете добиться того же с помощью трех строк кода, но почему?
  • и многие другие ...
4
ответ дан 18 December 2019 в 09:50
поделиться

Используйте его, чтобы запутать людей!

4
ответ дан 18 December 2019 в 09:50
поделиться

Я не знаю PHP, и я никогда не видел, чтобы короткое замыкание использовалось вне условия if или while в семействе языков C, но в Perl очень идиоматично сказать:

open my $filehandle, '<', 'filename' or die "Couldn't open file: $!";

Одним из преимуществ наличия всего этого в одном операторе является объявление переменной. В противном случае вам пришлось бы сказать:

my $filehandle;
unless (open $filehandle, '<', 'filename') {
    die "Couldn't open file: $!";
}

В этом случае трудно утверждать, что второй вариант чище. И это было бы более многословно на языке, на котором нет , если только

4
ответ дан 18 December 2019 в 09:50
поделиться

Я думаю, что ваш пример для фактора крутости. Нет причин писать такой код.

EDIT: У меня нет проблем с этим по идиоматическим причинам. Если все остальные, кто использует язык, используют оценку короткого замыкания для создания утверждений, понятных всем, то вам следует тоже. Однако мой опыт показывает, что подобный код редко пишется на языках семейства C; правильная форма - просто использовать оператор «if» как нормальный, который отделяет условное выражение (которое предположительно не имеет побочных эффектов) от вызова функции, которую условные элементы управления (что предположительно имеет много побочных эффектов).

2
ответ дан 18 December 2019 в 09:50
поделиться

Что делать, если у вас есть дорогостоящая (с точки зрения производительности) функция, которая возвращает логическое значение в правой части, которое вы хотели бы вызывать только в том случае, если другое условие было истинным (или ложным)? В этом случае короткое замыкание позволяет сэкономить много циклов процессора. Это делает код более кратким из-за меньшего количества вложенных операторов if. Итак, по всем причинам, которые вы указали в конце своего вопроса.

0
ответ дан 18 December 2019 в 09:50
поделиться

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

Случай 1 . Предположим, у вас есть указатель, который может быть или не быть NULL , и вы хотите проверить, что он не был NULL , и что то, на что он указывает, не было 0 . Однако вы не должны разыменовать указатель, если он NULL. Без операторов короткого замыкания вам пришлось бы сделать следующее:

if (a != NULL) {
  if (*a != 0) {
    ⋮
  }
}

Однако операторы короткого замыкания позволяют записать это более компактно:

if (a != NULL && *a != 0) {
  ⋮
}

с определенным знанием того, что * a будет не вычисляться, если a равно NULL .

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

my $file = $user_filename ||
           find_file_in_user_path() ||
           find_file_in_system_path() ||
           $default_filename;

Это устанавливает значение $ file равным $ user_filename , если оно присутствует, или результат find_file_in_user_path () , если он правда, или… и так далее. Возможно, это чаще встречается в Perl, чем в C, но я видел это в C.

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

2
ответ дан 18 December 2019 в 09:50
поделиться

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

1
ответ дан 18 December 2019 в 09:50
поделиться

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

a AND b AND c

В этой формуле есть два члена, вычисляемые слева направо.

если AND b имеет значение FALSE, то следующее выражение AND c может быть FALSE AND TRUE или FALSE AND FALSE. . Оба вычисляются как FALSE независимо от значения c. Поэтому компилятор не включает AND c в скомпилированный формат, что приводит к сокращению кода.

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

0
ответ дан 18 December 2019 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: