Следующие советы предназначены для ракетки :
Аргументы по умолчанию
Особенно полезно для создания псевдонимов для длинных имен функций, которые часто используются.
Предположим, что гольф позволяет вам написать функцию, которая использует аргумент, и предположим, что вам нужно reverse
много использовать . Вы начнете с чего-то вроде:
(λ(x) ... reverse ... reverse ... reverse ...
Вместо этого вы можете взять дополнительный аргумент с более коротким именем reverse
и установить его значение по умолчанию reverse
:
(λ(x[r reverse]) ... r ... r ... r ...
Кроме того, это полезно, если у вас есть вспомогательная функция, которую вы используете во многих местах с одними и теми же аргументами. Не забудьте переупорядочить аргументы функции по мере необходимости, чтобы вы могли использовать как можно больше аргументов по умолчанию и удалить аргументы из нескольких мест вызова.
match
Это немного сложнее подвести итог в небольшом посте, так что читайте на Racket Docs для этого. В двух словах, match
позволяет извлекать элементы и последовательности элементов в определенном порядке из списка, а синтаксис квазицитат позволяет объединить искаженный список:
(match (range 10)
[`(,xs ... 3 ,ys ... 6 ,zs ...)
`(,@(map f xs) 3 ,@(map f ys) 6 ,@(map f sz))]
...
Это также дает вам простой способ работать с регулярными выражениями и впоследствии делать дополнительные вычисления для результирующих групп,
названный let
Смотрите названный синтаксис здесьlet proc-id ...
.
Это позволяет вам писать рекурсивные функции, которые вызываются сразу без define
фактического вызова функции после ее определения.
Что-то вроде:
(define (fib i)
(if (< i 2) i
(+ (fib (- i 1)) (fib (- i 2)))))
(fib 10)
можно сократить до:
(let fib {[i 10]}
(if (< i 2) i
(+ (fib (- i 1)) (fib (- i 2)))))
Этот последний глупый, но я нигде не смог использовать этот маленький трюк:
(apply map list matrix)
делает транспонирование matrix
, где matrix
какой-то прямоугольный список списков, например '((1 2 3) (a b c))
.
Дайте мне знать, если это окажется полезным.