lisp

appendによるconsセル操作方法

appendは新しくコピーをつくるイメージがあったけれど,どうやら第1引数のリストはコピーして,最後のcdrに2引数の先頭へのポインタを格納する省コスト操作をしているらしい.Emacs Lispではそうらしいけれど,Common Lispではどうかな?Xyzzyでちょっと確認…

count-if関数

Lisperの後輩にそそのかされて薦められてPractical Common Lispを読んでいたら,count-if関数があることに気がつく.昨日のブラックジャックの問題を解くときに使った1の枚数を数える部分はこうやって書ける. (defun number-of-1 (lis) (count-if #'(lambda…

小数⇔分数の変換

そういえば計算結果に分数が出て,どうやって小数にするんだろと思っていた.解決.分数から小数への変換はcoerce関数を用いる.1/3のような循環小数は適当なところで丸められてしまう. (coerce 3/5 'float) => 0.6 (coerce 1/3 'float) => 0.3333333 小数…

Perlにおけるgrepが見つからない〜そこでTIMTOWTDIですよ!

Lispには高階関数が沢山用意されている.map族でいえば,mapにはじまり,mapcar, mapcan, mapcon, maplist, map-intoなどがある.ほとんど知らんし,使えん.当然のことながら今までmapcarくらいしか使ったことがなかったのだが,そういやPerlにおけるgrepに…

レッツ・チャレンジパソコン甲子園第12回の問題を解いてみた

日経ソフトウェア2008年4月号のパソコン甲子園の問題を解く連載.今回はブラックジャックの手札が与えられた際に点数を返すというもの. とても時間がかかりました.けれど,解法にはそれなりに満足. ブラックジャックルール説明 ブラックジャックは,1〜13…

コマンドラインからLispプログラムを呼び出す

他の言語でそうやるように,コマンドラインからLispプログラムを呼び出したい.軽く調べてみたところ,あまり情報がない.とりあえず知りえたことをメモ. 他の処理系ではわからないけれど,CLISPの場合,こんな感じのプログラムを書けば良い. ; test.lisp …

SLIMEの正しい終了方法

SLIMEの正しい終了の仕方を知らず,lispプロセスがみっつも残ってCPUを占拠してた. YABEEEEE!!!11と思ってkillしようとしたが殺せない.よくわからないのでrebootする羽目になった.rebootする前にuptimeしたら173daysだって.一斉停電以降ずっと稼動してた…

Lispにおける配列の使い方

そういや今までLispで配列を使ったことがなかった.Lispのリストはデータ構造でいえば線形リストなので要素の追加や挿入が楽だけれど,規模が大きくなるとo(n)で時間がかかる.配列の場合は配列ポインタからのオフセットで表現されるのでランダムアクセスが…

SLIME導入

Lispのメイン開発環境はxyzzyだったけれど,今後のことを考えてSLIME導入. インストールは簡単.FreeBSDなのでPortsから入れて.emacsをマニュアルどおりに変更.GCLが対応してないっぽいので,CLISPを使うことにする(って違いがわからんくらいの初心者です…

mapcarで内積の計算

完全に寝ぼけていた.mapcarを 要素が値のふたつのリストの内積を取る場合,こんな感じで書ける (defun inner-product (xlis ylis) (apply '+ (mapcar '* xlis ylis))) mapcarは引数に複数リストを取ることもできる.その場合は,その数分のcarを第一引数の…

分割数を求める.

ようやく積読状態にあった数学ガールを読んでいる.これはすごい.テスト前に覚えて2時間後には忘却の彼方だったテイラー展開や絶対不等式からの相加相乗平均の証明など,秀逸なものばかり.これは高校生の頃に読みたかった! 実は部分的に理解していないも…

文字列数値やsplit

Common Lispにあるはずのstring-to-numberがxyzzyになくて困った.(Common Lispにもない.とあるxyzzy使いさんご指摘ありがとうございます!) 本来ならば (number-to-string 256) "256" (string-to-number "128") 128 で変換できる.できない. どうやらxy…

Lispの構造体

かっこつけてちょっと大規模なプログラムを書きたくなったので,機械学習の初歩的なプログラムを実装しようとLispでかりかりしている.距離関数などの記述は非常に楽だなぁと思う. データのインスタンスをどうやって書こうと思っていて構造体があれば楽だな…

Perlのjoin関数

にあたるものがないっぽい.concatと高階関数を使えば実現できるかもしれないのだけれど,Lisp脳が出来ていないので無理. ゆとりらしく,自分にあったものを書くことにした. (defun join (delm lis) (do ((oldlis lis (cdr oldlis)) (str (car lis) (conca…

Lisp楽しい

学部3年で情報工学科のLisp授業にもぐってから苦節3年(その間ほとんど触ってないけれど),ようやくLispでプログラムが書けるようになってとても楽しい. 今日やったことまとめ(時系列順) 距離関数をかりかり書きまくる 構造体の存在に気がつく.ちょっと…

NaiveBayes in Lisp

LispでNaiveBayesを実装してみた.ハッシュの力に頼らざるを得なかったし,不必要なところでもハッシュを多用している.明らかにPerl病なコードが完成した. コメント空行込みで130行程度.勉強時間,ハマった時間を含めて3時間程度かかった. 書き終えて思…

ハッシュで便利そうな自作関数

Perlのようにexisitsを気にせずに使える関数を自作.既にあるだろうけれど,自分でやることに意義がある.おつかいと一緒.それにしてもネーミングセンスわろし. (defun hash++ (key hash) (if (null (gethash key hash)) (setf (gethash key hash) 1) (set…

ハッシュの基本

前回の挫折ポイントであるハッシュから開始.めちゃくちゃ簡単なことに気がつく. 基本操作はこんな感じ ; ハッシュを作成 (setq myhash (make-hash-table) ; 値の代入 (setf (gethash 'hoge myhash) 1) (setf (gethash 'foo myhash) 2) ; 取得 (getf 'hoge …

mapcarの使い方

今までmapcarの引数はリストひとつしか使えないと思っていた リファレンスを見たら,こんな例が (mapcar 'cons '(1 2 3) '(4 5 6)) ((1 . 4) (2 . 5) (3 . 6)) ということは,まさか (mapcar 'list '(1 2 3) '(4 5 6)) ((1 4) (2 5) (3 6)) キタコレ lambda関数…

隣り合う二項の差

どう書く?orgで出題されていた,自分のLisp力でも解けそうな,それでいてLispで書きやすそうなお題をピックアップ 隣合う二項の差 - どう書く?org cdr再帰に凝っている自分としては,ループは再帰で書きたい.まさしくcdr再帰(笑) (defun diff (lis) (co…

最小二乗法

最小二乗法を書いてみた.だんだん前置記法に慣れてきた.頭の中に構文木ができてきている予感.とりあえずはmapcar, applyの便利さに感動.今までPerlで高階関数を使ってこなかったことを激しく後悔

高階関数三銃士

勝手に3つ選んだ.というより3つしかシラネ mapcar apply funcall mapcar, applyはいわずもがな,funcallのことをずっと知らなかった.アトムの値にlambda関数を適用したいなーと思ったときに,阿呆なのでわざわざlistして,mapcarしてcarしてた.funcallで解決…

condの代わりにandを使う

入門Common Lispを読んで気がついた.cdr再帰の場合,お約束のように (cond ((null lis) nil) (... という式を書くけれど.andにしてしまえばいい (and lis ... lisがnilの場合は当然,そこで評価が終わってnilが返されるのだから.andすげぇぇeeeeee

今さらながらクイックソート

どの本でも再帰の章には必ずといってもいいほどクイックソートが紹介されている.もううんざりするほどクイックソートの説明を読んできたつもりだが,Lisperの後輩がRubyでLispライクにクイックソートのコードを書いてきやがった.というのが半年くらい前に…

リストからべき集合を生成する

(これがLISPだ! (Information & computing (30))より) リストを受け取り,そのリストのすべての組み合わせを生成する関数を考える.(飛ばしてよい)問題だったのでスルーしていたけれど,よっしゃやってみようと思って考えること30分. 紙の上で考えたら…

過去の問題にリベンジ(その1)

この間,入門Common Lispを読んだおかげか「なりふりかまわなければ」Lispでも少しくらい何か書けるような自信がついた. というわけで埃をかぶっていたLispの本を持ち出して,演習問題を解いてみることにした. 【ちょっと回想】学部3年の頃,情報工学科のL…

コラッツの問題

パソコン甲子園2007年本選の問題 正の整数に対し, nが偶数のときは2で割る nが奇数のときは3倍して1を足す という操作を繰り返すと結果が1になる. 整数nを入力とし,結果が1になるまで繰り返される操作の回数を出力するプログラムを作成せよ. どうやら1に…