Что более идиоматично: dotimes vs loop repeat? - PullRequest
1 голос
/ 27 сентября 2019

Какой из этих примеров кода является более идиоматическим Common Lisp?

(dotimes (_ 10) (write-line "Hello"))

Или

(loop repeat 10 do (write-line "Hello"))

Или, альтернативно, не существует предпочтительного способа итеративного цикла в Common Lisp, и мы должны простоиспользовать, что мы когда-либо чувствовали?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2019

В ANSI Common Lisp Пол Грэм возражает против использования loop, потому что стандарт плохо определен («Единственное реальное определение этого макроса - это его реализация ...»);однако есть несогласных мнений .

dotimes в вашем примере, возможно, проще, но для него требуется одноразовая переменная _.По этой причине я предпочитаю loop здесь - но мнения по поводу loop сильно отличаются.К вашему последнему замечанию, как Питер Сейбел пишет : «Некоторые хакеры Lisp любят LOOP; другие ненавидят его. Поклонникам LOOP это нравится, потому что он обеспечивает краткий способ выражения некоторых часто используемых циклических конструкций. Его хулителям не нравится это, потому чтоэтого недостаточно, Лиспи.

2 голосов
/ 27 сентября 2019

Это не имеет большого значения.Используйте любой из них.

Вы также можете добавить свои собственные операторы управления:

(defmacro repeat (n &body body)
  `(loop repeat ,n do (progn ,@body)))

Затем используйте его:

CL-USER 52 > (repeat 10
               (write-line "hello")
               (write-line "world"))
hello
world
hello
world
...
world
hello
world
NIL
...