Scheme/synonym: различия между версиями

Материал из ALT Linux Wiki
м (+category)
 
(не показано 7 промежуточных версий 3 участников)
Строка 1: Строка 1:
== Scheme: велопипеды и синонимы ==
[[category:scheme]]
==Синонимы и велосипеды==


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


'''"Велосипеды" из SRFI-1'''
'''"Велосипеды" из SRFI-1 и SRFI-13'''


{| class="standard"
{| class="standard"
Строка 11: Строка 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
|-
|}
|}


Строка 86: Строка 76:
|-
|-
|
|
(and (< a b) (b c))
(and (< a b) (<b c))
|
|
(< a b c)
(< a b c)
Строка 98: Строка 88:


'''Опасные моменты'''
'''Опасные моменты'''
*'''fold-left''' - это итеративный процесс, но '''fold-right''' - рекурсивный, соотв. , на больших списках может закончится стек.
*'''fold-left''' - это итеративный процесс, но '''fold-right''' - рекурсивный, соотв., на больших списках может закончиться стек.

Текущая версия от 11: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 - рекурсивный, соотв., на больших списках может закончиться стек.