Какие общие советы у вас есть для игры в гольф в Racket / Scheme ? Я ищу идеи, которые могут быть применены к задачам по коду для гольфа в целом, которые, по крайней мере, несколько специфичны для Racket / Scheme (например, «удалить комментарии» - это не ответ).
Я знаю, что Scheme и Racket (ранее PLT Scheme) были технически разными языками, но во многих отношениях они очень похожи, и большая часть кода (я подозреваю) будет работать в основном так, как задумано. Если ваш совет относится только к одному из вышеупомянутых языков, обратите внимание как таковое.
let
часто реализуются в терминахlambda
.В Ракетка ,
require
формы могут иметь несколько аргументов.Это намного короче, чем
Я не знаю много о Схеме , но, похоже, в ней нет
require
встроенной функции.источник
Используйте более короткие синонимы
В Racket есть ряд процедур, которые имеют в основном эквивалентные более короткие версии. (Они обычно не эквивалентны: например,
(car (cons 1 2))
работает там, где(first (cons 1 2))
не получается. Но вы можете сделать замену, если знаете, что в вашем случае они являются синонимами.)Этот список, вероятно, неполный: я, вероятно, еще не знаю о большинстве вещей, которые могли бы пойти в этом списке.
(= a b)
а не(equal? a b)
при сравнении чисел.'(1 2)
вместо(list 1 2)
.car
,cadr
,cdr
Дляfirst
,second
иrest
.null?
вместо тогоempty?
modulo
вместо того,remainder
когда модуль является положительным.floor
вместо того,truncate
когда его аргумент положительный.источник
Пропустить ненужные пробелы
Это может считаться «тривиальным» отзывом, но на него нужно что-то указывать.
Каждый раз, когда вы читаете код Racket, написанный обычными людьми (например, в документации по Racket ), в него будут вставлены все пробелы: например,
Фактически, поскольку
(
и)
не могут быть частью имен переменных, мы можем удалить все пробелы вокруг них и не потерять никакой двусмысленности (и, что более важно, все еще получить корректный код). Таким образом, приведенное выше выражение может быть:источник
Следующие советы предназначены для ракетки :
Аргументы по умолчанию
Особенно полезно для создания псевдонимов для длинных имен функций, которые часто используются.
Предположим, что гольф позволяет вам написать функцию, которая использует аргумент, и предположим, что вам нужно
reverse
много использовать . Вы начнете с чего-то вроде:Вместо этого вы можете взять дополнительный аргумент с более коротким именем
reverse
и установить его значение по умолчаниюreverse
:Кроме того, это полезно, если у вас есть вспомогательная функция, которую вы используете во многих местах с одними и теми же аргументами. Не забудьте переупорядочить аргументы функции по мере необходимости, чтобы вы могли использовать как можно больше аргументов по умолчанию и удалить аргументы из нескольких мест вызова.
match
Это немного сложнее подвести итог в небольшом посте, так что читайте на Racket Docs для этого. В двух словах,
match
позволяет извлекать элементы и последовательности элементов в определенном порядке из списка, а синтаксис квазицитат позволяет объединить искаженный список:Это также дает вам простой способ работать с регулярными выражениями и впоследствии делать дополнительные вычисления для результирующих групп,
названный
let
Смотрите названный синтаксис здесь
let proc-id ...
.Это позволяет вам писать рекурсивные функции, которые вызываются сразу без
define
фактического вызова функции после ее определения.Что-то вроде:
можно сократить до:
Этот последний глупый, но я нигде не смог использовать этот маленький трюк:
(apply map list matrix)
делает транспонированиеmatrix
, гдеmatrix
какой-то прямоугольный список списков, например'((1 2 3) (a b c))
.Дайте мне знать, если это окажется полезным.
источник
Как указал Винни ,
#!
обычно можно использовать вместо#lang
сохранения четыре байта.источник