Lispでのゴルフのヒント


9

Lisp(あらゆる方言)でゴルフをする上での一般的なヒントは何ですか?回答ごとに1つのヒントを投稿してください。Lispの方言に固有の回答のみ(たとえば、「コメントの削除」は回答ではありません)。

ヒントが適用されるLispの方言をヒントとともに投稿してください。



1
これらがSchemeやRacketでのゴルフコツとは違う思いますか?
Alex A.

1
私はあなたのゴルフの楽しみのために、Lispのより小さな、簡略化されたバージョンであるtinylispを使用することをお勧めします。
ckjbgames 2017

回答:


4

関数パラメーターを並べ替えて空白を最小化

の代わりに

(defun f(a b)(...))
...
(f x(1+ y))

のようなものを試してください

(defun f(b a)(...))
...
(f(1+ y)x)

1

アトムを印刷することで大文字からなる文字列を印刷する

princCommon Lisp の関数は短く、エスケープ文字なしでオブジェクトを印刷します。synaxを含むCommon Lispシンボルを印刷する場合、これにより、'symbol-name印刷したいものを引用する必要がなくなり、空白も節約できます。記号を印刷する場合、大文字で表記されることに注意してください。また、改行やスペースは追加されないため、連結する必要はありません。

例えば、

(princ'hai)

印刷されますHAI

そして

(princ'hai)(princ(read))

HAIを出力し、入力を要求し、出力します。たとえば、helloと入力すると、結果は

HAIhellohello

1

インクリメントとデクリメントに使用1+1-ます

代わりの(+ a 1)(- b 1)試してみます(1+ a)(1- b)


分かりません。されていない1+2つのトークンとして解析、1および+?と思いました+1
Esolanging Fruit 2017

Challenger5 @ 1+および1-単一のトークンとして解析されているCommon LispのHyperSpec機能1+、1-
ceilingcat

名前は数字で始めることはできないと思いましたか?
2017

@EsolangingFruitこれ Lispです...
ASCIIのみ

1

loopandを使用します。formatこれはprintfステロイドのようなものです。format反復と条件、およびローマ数字、英語の数字、英語の複数形が含まれます。非常に醜く、非常にコンパクトです。


1

条件付き出力

GNU Common Lisp

~v^

アップとアウトディレクティブは~^、最も一般的に、最後のリスト項目の後に終了する操作を書式設定リストで使用されています。ただし、v修飾子とともに使用して引数を消費することもできます。その場合、引数がゼロの場合は終了します。これは、によって生成されるゼロを処理する場合に特に役立ちdotimesます。

(loop as n from 1 to 10 do(format t"~d~%"n))

(dotimes(n 11)(if(> n 0)(format t"~d~%"n)))

(dotimes(n 11)(format t"~v^~d~%"n n))

format(condition)

最初の引数は、formatのいずれかにすることができtnil別名()、またはストリーム。渡された場合t、それはへの出力を意志stdoutならば、nilそれは文字列としてフォーマットされた出力を返します。これは条件付き出力として使用できます。上記の例は、次のように短く書くこともできます。

(dotimes(n 11)(format(> n 0)"~d~%"n))

値が出力された場合、戻り値はになりますnil。このため、doループの終了条件としても使用できます。

(do((n 11))((<(decf n)1))(format t"~d~%"n))

(do((n 11))((format(>(decf n)0)"~d~%"n)))

~[...~]

条件付きフォーマッタは引数を消費し、インデックスからリストからフォーマット文字列を選択します。一般的な使用例は、デフォルトのフォーマッター~:;を使用して、ゼロかゼロでないかを選択することです。

(dotimes(n 11)(format t"~v^~[~r~:;~d~]~%"n(mod n 3)n))

条件付きフォーマッターをネストすることもできます。その場合、それぞれが順番に引数を消費します。


~&

上記の各例で~%は、改行を出力するために使用されます。ほとんどの場合、これはリテラルの改行で置き換えることができます。もう1つのオプションはを使用することです~&。これは、出力カーソルが行の先頭(別名)にない場合にのみ改行を発行しますfresh-line

~%~&はどちらも、v修飾子付きまたは定数として引数を取ることができ、できるだけ多くの改行を生成します。また、どちらも負の引数を喜んで受け入れます。その場合、何も出力されません。


外部参照

実用的なCommon Lisp
18.いくつかのFORMATレシピ

Common Lisp the Language、2nd Edition
22.3.3。文字ストリームへのフォーマット済み出力

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.