Очень часто вместо одной функции можно использовать другие, иногда это бывает полезно.
Например во многих случаях программа начинает быстрее работать.
Сначала коллекция из srfi-1
Вариант 1 | Вариант 2 |
not + pair | not-pair |
car + last-pair | last |
fold + reverse | fold-right |
list-tail | drop, а заодно есть и take. |
(delq #f)+ map | filter-map |
apply + append + map | append-map |
apply + append | concatenate |
contatenate+ map | append-map |
Ну и несколько заметок про стандартный R5RS
Вариант 1 | Вариант 2 |
(= x 0) | (zero? x) |
(> x 0) | (positive? x) |
(< x 0) | (negative? x) |
(lambda(x) x) | values |
(list->vector x) | (apply vector x) |
(and (< a b) (b c)) | (< a b c) |
Просто рекомендации:
Очень полезно бывает скрывать некоторые «склеивающие» операции внутри функции – выглядеть будет гораздо нагляднее.
Например, (my-url «/aaa» «/bbb» “ccc”) выглядит гораздо понятнее, чем (my-url (string-append «/aaaa” «/bbb” «ccc)).
Опасные моменты
fold-left – это итеративный процесс, но fold-right – рекурсивный, соотв., на больших списках может закончится стек.