Я собираюсь взять слегка субъективный вопрос и дать очень субъективный ответ, поскольку Ира уже дала совершенно прагматичный и логичный ответ.: -)
Я знаю, что написание вещей явно высоко ценится в некоторых кругах (ребята из Python делают это частью своего "дзен"), но даже когда я писал Python, я никогда не понимал этого.Я хочу писать на максимально высоком уровне, все время.Когда я хочу написать вещи явно, я использую язык ассемблера.Смысл использования компьютера (и HLL) состоит в том, чтобы заставить его делать эти вещи для меня!
Для вашего my-remove-if
примера, редуктор выглядит хорошо для меня (кроме таких схем, какfold
и lst
:-)).Я знаком с понятием уменьшения, поэтому все, что мне нужно понять, это выяснить ваш f(x,y) -> z
.Что касается явного варианта, мне пришлось задуматься на секунду: я должен сам разобраться в цикле.Рекурсия не самая сложная концепция, но я думаю, что она сложнее, чем «функция двух аргументов».
Мне также все равно, что вся строка повторяется - (my-remove-if pred (cdr lst))
.Я думаю, что мне нравится Lisp отчасти потому, что я абсолютно безжалостен в DRY, и Lisp позволяет мне быть DRY на осях, которых нет в других языках.(Вы можете добавить еще один LET
вверху, чтобы избежать этого, но тогда он будет длиннее и сложнее, что, я думаю, является еще одной причиной, чтобы предпочесть сокращение, хотя в этот момент я мог бы просто рационализировать.)
Я думаю, что, возможно, контексты, в которых ребята из Python, по крайней мере, не любят неявную функциональность, будут:
- , когда никто не может угадать поведение (например,
frobnicate("hello, world", True)
- чтоИстина означает?), или: - случаи, когда неявное поведение целесообразно изменить (например, когда аргумент
True
перемещается, удаляется или заменяется чем-то другим, поскольку нет ошибки времени компиляциив большинстве динамических языков)
Но reduce
в Лиспе не справляется с обоими этими критериями: это хорошо понятная абстракция, которую все знают, и которая не изменится, по крайней мере, ни для одноговремя, которое меня волнует.
Теперь я абсолютно уверен, что есть некоторые случаи, когда мне было бы проще прочитать явный вызов функции, но яЯ думаю, вы должны быть очень изобретательны, чтобы придумать их.Я не могу придумать ничего лишнего, потому что reduce
и mapcar
и друзья действительно хороши абстракций.