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

Материал из ALT Linux Wiki
(Import from freesource.info)
 
м (+category)
 
(не показано 11 промежуточных версий 3 участников)
Строка 1: Строка 1:
[[Category:Sisyphus]]
[[category:scheme]]
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/Alterator/synonym}}
==Синонимы и велосипеды==
 
== Scheme: велопипеды и синонимы ==


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


Сначала коллекция из srfi-1
'''"Велосипеды" из SRFI-1 и SRFI-13'''


{| border="1"
{| class="standard"
|-
|-
|
!Вариант 1
Вариант 1
!Вариант 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
|-
|}
|}




Ну и несколько заметок про стандартный R5RS
'''"Велосипеды" из R5RS'''


{| border="1"
{| class="standard"
|-
|-
|
!Вариант 1
Вариант 1
!Вариант 2
|
Вариант 2
|-
|-
|
|
Строка 93: Строка 76:
|-
|-
|
|
(and (< a b) (b c))
(and (< a b) (<b c))
|
|
(< a b c)
(< a b c)
Строка 99: Строка 82:




Просто рекомендации:
'''Полезные рекомендации'''
 
*Очень полезно бывает скрывать некоторые "склеивающие" операции внутри функции - выглядеть будет гораздо нагляднее.
Очень полезно бывает скрывать некоторые "склеивающие" операции внутри функции - выглядеть будет гораздо нагляднее.
Например, (my-url "/aaa" "/bbb" "ccc") гораздо понятнее, чем (my-url (string-append "/aaaa" "/bbb" "ccc)).
Например, (my-url "/aaa" "/bbb" "ccc") выглядит гораздо понятнее, чем (my-url (string-append "/aaaa" "/bbb" "ccc)).
 


<div style="display: inline; color: red;">Опасные моменты</div>


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