Наступні поради щодо ракетки :
Аргументи за замовчуванням
Особливо корисно для створення псевдонімів для довгих імен функцій, які часто використовуються.
Припустимо, гольф дозволяє записати функцію, яка споживає аргументи, і припустимо, що потрібно reverse
багато використовувати . Ви почнете з чогось типу:
(λ(x) ... reverse ... reverse ... reverse ...
Ви можете замість цього взяти додатковий аргумент із скороченим іменем reverse
та встановити його за замовчуванням reverse
:
(λ(x[r reverse]) ... r ... r ... r ...
Крім того, це корисно, якщо у вас є допоміжна функція, яку ви використовуєте в багатьох місцях з одними і тими ж аргументами. Не забудьте змінити аргументи на функцію за необхідності, щоб ви могли використовувати якомога більше аргументів за замовчуванням та видаляти аргументи з декількох викликів.
match
Це трохи складніше узагальнити у невеликому дописі, тому читайте на Документах ракетки для цього. Коротше кажучи, 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))
.
Повідомте мене, чи виявиться це корисним.