Scheme/synonym
Материал из ALT Linux Wiki
< Scheme(Различия между версиями)
(→Scheme: велопипеды и синонимы) |
м (+category) |
||
(6 промежуточных версий не показаны.) | |||
Строка 1: | Строка 1: | ||
+ | [[category:scheme]] | ||
+ | ==Синонимы и велосипеды== | ||
+ | |||
Очень часто вместо одной функции можно использовать другие, иногда это бывает полезно. | Очень часто вместо одной функции можно использовать другие, иногда это бывает полезно. | ||
Например во многих случаях программа начинает быстрее работать. | Например во многих случаях программа начинает быстрее работать. | ||
- | '''"Велосипеды" из SRFI-1''' | + | '''"Велосипеды" из SRFI-1 и SRFI-13''' |
{| class="standard" | {| class="standard" | ||
Строка 9: | Строка 12: | ||
!Вариант 2 | !Вариант 2 | ||
|- | |- | ||
- | | | + | |not + pair |
- | not + pair | + | |not-pair |
- | | | + | |
- | not-pair | + | |
|- | |- | ||
- | | | + | |car + last-pair |
- | car + last-pair | + | |last |
- | | | + | |
- | last | + | |
|- | |- | ||
- | | | + | |fold + reverse |
- | fold + reverse | + | |fold-right |
- | | | + | |
- | fold-right | + | |
|- | |- | ||
- | | | + | |list-tail |
- | list-tail | + | |drop, а заодно есть и take. |
- | | | + | |
- | drop, а заодно есть и take. | + | |
|- | |- | ||
- | | | + | |(delq #f)+ map |
- | (delq #f)+ map | + | |filter-map |
- | | | + | |
- | filter-map | + | |
|- | |- | ||
- | | | + | |apply + append + map |
- | apply + append + map | + | |append-map |
- | | | + | |
- | append-map | + | |
|- | |- | ||
- | | | + | |apply + append |
- | apply + append | + | |concatenate |
- | | | + | |
- | concatenate | + | |
|- | |- | ||
| | | | ||
contatenate+ map | contatenate+ map | ||
- | | | + | |append-map |
- | append-map | + | |- |
+ | |apply+string-append | ||
+ | |string-concatenate | ||
+ | |- | ||
|} | |} | ||
Строка 84: | Строка 76: | ||
|- | |- | ||
| | | | ||
- | (and (< a b) (b c)) | + | (and (< a b) (<b c)) |
| | | | ||
(< a b c) | (< a b c) | ||
Строка 96: | Строка 88: | ||
'''Опасные моменты''' | '''Опасные моменты''' | ||
- | *'''fold-left''' - это итеративный процесс, но '''fold-right''' - рекурсивный, соотв. , на больших списках может | + | *'''fold-left''' - это итеративный процесс, но '''fold-right''' - рекурсивный, соотв., на больших списках может закончиться стек. |
Текущая версия на 08:52, 21 июня 2016
Синонимы и велосипеды
Очень часто вместо одной функции можно использовать другие, иногда это бывает полезно. Например во многих случаях программа начинает быстрее работать.
"Велосипеды" из SRFI-1 и SRFI-13
Вариант 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 |
apply+string-append | string-concatenate |
"Велосипеды" из 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 - рекурсивный, соотв., на больших списках может закончиться стек.