さくらんぼのlambda日記

lambdaちっくなことからゲーム開発までいろいろ書きます。

Lisp

除算の商と余りを求める

mod,rem,floor,truncateが使える! C言語とちがって余りは正剰余と負剰余の両方が選べます。 正剰余 負剰余 余り mod rem 商と余り floor truncate (mod 5 2) 1 (rem 5 2) 1 (mod -1 3) 2 CL-USER> (rem -1 3) -1 (floor 5 2) 2 1 (truncate 5 2) 2 1 (floor…

整数と浮動小数点を相互変換する(精度の変換)

乱数を生成する

平方根を求める

対数を計算する

三角関数を計算する

小数点を切り上げ・切り捨て・四捨五入するには

絶対値を求める

除算の商と余りを求める

任意のビット位置の値を参照する

はい。これはldb関数を使えば良いですね。 ; ldbは第一引数にしたがってデータを読みます ; 単位はbit ; s : size ; p : position (ldb (byte s p) target) ; 4bit左に移動して1bit読む (ldb (byte 1 4) #b10000) =>1

おまけ

formatの~Rには以下の機能もあるみたいです パラメータを1つも指定しなかったときは,修飾子の指定により以下の動作をする. * 修飾子なし: 整数を英語の綴り(基数)で出力. * ‘ : ’ 修飾子のみ: 整数を英語の綴り(序数)で出力. * ‘ @ ’ 修飾子のみ:…

数値を2進数・8進数・16進数表現の文字列に変換するには

GW中なのにも関わらず更新できてない! 腹を切って死ぬべきです。さて掲題の課題ですがformat関数を使えば簡単に実現できそうですね。 ところでformat関数はオプションが多すぎてさっぱり分からないです。 http://super.para.media.kyoto-u.ac.jp/~tasuku/fo…

2進数・8進数・16進数で数値を扱うには

はい。これは結構簡単だと思われます。 #b10000 ;=> 16 #o20 ;=> 16 #x10 ;=> 16 #16R10 ;=> 16 #XA1 ;=> 161 これ以外にもLispは36進数まで表現できますw #36Rzz ;=> 1295 ね。簡単でしょ?

気分一新します

やっと環境も整備できてきたのでそろそろ再開ですよ!http://www.namaraii.com/rubytips/?%BF%F4%C3%CD 次は数値をやろうかと思います。

Lispで文字を寄せる

文字を寄せる方法を簡単にですが実装してみました。 (defun make-string-lefted (count target) (let((space-num (- count (length target)))) (concatenate 'string target (make-string space-num :initial-element #\Space)))) (defun make-string-righte…

マルチバイト文字の数を数える

どういう処理系を使っているかにもよりますが、最近の処理系ですと問題無くカウントできる気がします。 (length "あああ") 3

文字列中に含まれている任意文字列の位置を求める

これも正規表現ライブラリcl-ppcreを使えばラクチン!

マルチバイト文字列の最後の1文字を削除する

どういう処理系を使って(以下略 (setq *my-strings* "あいうえお") "あいうえお" (subseq *my-strings* 0 (- (length *my-strings*) 1)) "あいうえ"

文字列中で指定したパターンにマッチする部分を置換する

これは正規表現ライブラリcl-ppcreを紹介するときに紹介しましたね。ここでは省略してしまいまーす。

"次"の文字列を取得する

これは前回つかったchar-codeとcode-charという文字コードから文字を生成する関数を利用すればできそうですね。 (code-char (char-code #\a)) #\a うん。 #\aから数字にして、数字から文字に変換できているようですね。 (code-char (+ 1 (char-code #\a))) #…

Lispで文字列! その2!

今日も昨日の続きです。 残件はー。 文字列を中央寄せ・左詰・右詰する "次"の文字列を取得する 文字列を暗号化する 文字列中で指定したパターンにマッチする部分を置換する 文字列中に含まれている任意文字列の位置を求める 文字列の末端の改行を削除する …

文字列を浮動小数点に変換する

ちょっと順番が前後してしまいましたが、今度は小数などを読み込む方法です。 read-from-stringを使えばらくちんです。 (read-from-string "10.0") 10.0 4 (read-from-string "1/2") 1/2 3 ちなみにread-from-stringはLispのリテラルを理解できるので複素数…

ASCII文字をコード値に(コード値をASCII文字に)変換する

これはchar-codeを使えば実現できます。Lispだと文字の表現が普通の言語と違う(#\をつける)ところだけ注意が必要でしょうか。 (char-code #\A) 65

8進文字列を整数に変換する && 16進文字列を整数に変換する

Lispだとこれらの変換は一纏めで処理できるのでまとめてしまいます。 (parse-integer "11" :radix 2) 3 2 (parse-integer "77" :radix 8) 63 2 (parse-integer "99" :radix 10) 99 2 (parse-integer "FF" :radix 16) 255 2 (parse-integer "FFF" :radix 16) …

文字列の先頭と末尾の空白文字を削除する

これはそのものずばりtrimを使えばできます。先頭とか末尾を指定する場合には、string-left-trimやstring-right-trimを使うことが出来ます。 ただ、Common Lispのtrimは他の処理系(Ruby、PHPなど)と違って空白文字に相当するものを引数で指定するようです。…

文字列を1行ずつ処理する

これはread-lineを使えば簡単に実現できます。with-input-from-stringで文字列をストリームにしてから処理という感じですね。 (with-input-from-string (in "foo bar baz") (do ((line (read-line in nil) (read-line in nil))) ((null line)) (print line))…

文字列を1文字ずつ処理する

これは実はすでに使っていますね。mapを使えば実現できます。 (map 'string #'(lambda (x) (princ x)) "hogehoge") hogehoge "hogehoge" こんな感じで出来ます。

cl-ppcreって

知らなかったのですが、独自の記述方法で正規表現を記述できるのですね。 http://weitz.de/cl-ppcre/#create-scanner2 このツリーをパースしてスキャナを作ってくれる関数の説明にその詳細が書いてあります。この方式で書くと階層構造を持った状態で正規表現…

Lispで正規表現!

いい加減疲れた!正規表現つかうのがいいよ!最近はclbuildで管理しているので、下のコマンドでcl-ppcreをインストールしました。 ./clbuild install cl-ppcre これだけでOK!使うときは適宜 (require 'cl-ppcre) で使えます! 前回の課題にあった文字列置換…

部分文字列を置き換える

replaceだと何が駄目かというと、掲題のRubyの例ですと s = "Apple Banana Orange" s[0..4] = "Vine" #=> s = "Vine Banana Orane" s[5, 6] = "Lemon" #=> s = "Vine Lemon Orange" のようになっています。 これは、指定した範囲を引数の文字列で置き換える…