回答:
式は'x
、`x
、,x
、,@x
自動的に拡大(quote x)
、(quasiquote x)
、(unquote x)
、と(unquote-splicing x)
、それぞれ。これは純粋に構文変換であり、どこにでも適用できます。これは、1変数関数に便利な表記法を提供します。
; Defining a function:
(define ,x (+ x x))
; Calling a function:
(display ,2)
に展開します
; Defining a function:
(define (unquote x) (+ x x))
; Calling a function:
(display (unquote 2))
私は確かにどのような構文上のキーワードをシャドウイングのための意味論じゃないquote
か、quasiquote
上記の私が上でそれをテストした通訳で働いていた、とのようなコードが、バインドされた変数とunquote-splicing
、それは2文字の略語を持っているので、理想よりも少ないですが、unquote
は、1文字の略語を持つ補助構文であるため、このハックに最適です。
ラケットを使用する場合する場合は、を使用λ
して変数をバインドし、数バイト削ります。ではスキーム、lambda
1が4つの以上の変数をバインドされていない限り、このトリックは適用されませんなります。
例:1つの変数でlet
/ を2バイト節約define
(define n 55)(* n n) ; 20 bytes
(let([n 55])(* n n)) ; 20 bytes
((λ(n)(* n n))55) ; 18 bytes
ラケットには、ほぼ同等の短いバージョンを持つ多くの手順があります。(彼らは通常、等価ではありません。たとえば、(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
引数が正の場合の代わりに。これは「些細な」ヒントと見なすことができますが、どこかに指摘する必要があります。
普通の人が書いたラケットコード(ラケットのドキュメントなど)を読むと、すべてのスペースが入れられます。たとえば、
(append (list 1 2) (list 3 4) (list 5 6) (list 7 8))
実際、(
と)
は変数名の一部にできないため、変数の周囲のすべてのスペースを削除し、あいまいさを失わないようにすることができます(さらに重要なことは、有効なコードを取得することです)。したがって、代わりに上記の式は次のようになります。
(append(list 1 2)(list 3 4)(list 5 6)(list 7 8))
次のヒントはラケット用です。
頻繁に使用される長い関数名のエイリアスを作成するのに特に便利です。
ゴルフでは、引数を消費する関数を記述することができ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))
。
これが役立つかどうかを教えてください。
以下のようにWinnyが指摘し、#!
通常の代わりに使用することができ#lang
、4バイトを保存し、。
#lang racket ;12 bytes
#!racket ;8 bytes