Lisp(あらゆる方言)でゴルフをする上での一般的なヒントは何ですか?回答ごとに1つのヒントを投稿してください。Lispの方言に固有の回答のみ(たとえば、「コメントの削除」は回答ではありません)。
ヒントが適用されるLispの方言をヒントとともに投稿してください。
Lisp(あらゆる方言)でゴルフをする上での一般的なヒントは何ですか?回答ごとに1つのヒントを投稿してください。Lispの方言に固有の回答のみ(たとえば、「コメントの削除」は回答ではありません)。
ヒントが適用されるLispの方言をヒントとともに投稿してください。
回答:
princ
Common Lisp の関数は短く、エスケープ文字なしでオブジェクトを印刷します。synaxを含むCommon Lispシンボルを印刷する場合、これにより、'symbol-name
印刷したいものを引用する必要がなくなり、空白も節約できます。記号を印刷する場合、大文字で表記されることに注意してください。また、改行やスペースは追加されないため、連結する必要はありません。
例えば、
(princ'hai)
印刷されますHAI
。
そして
(princ'hai)(princ(read))
はHAI
を出力し、入力を要求し、出力します。たとえば、helloと入力すると、結果は
HAIhellohello
1+
し1-
ます代わりの(+ a 1)
か(- b 1)
試してみます(1+ a)
か(1- b)
。
1+
2つのトークンとして解析、1
および+
?と思いました+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
のいずれかにすることができt
、nil
別名()
、またはストリーム。渡された場合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。文字ストリームへのフォーマット済み出力