2009年5月26日火曜日

「10分でコーディング x 2 〜リストの破壊的操作篇〜」を解いてみる

乗り遅れた感はありますが、g00000さん出題のLISP問題を解いてみました。

10分でコーディング x 2 〜リストの破壊的操作篇〜 - わだばLisperになる - cadrグループ

リストの破壊的操作 - 日々ごちゃごちゃと考える 経由

(1) alistを破壊的にplistに変換する関数(nalist-to-plist)を書いて下さい。
(2) nplist-to-alistも作ってみて下さい。

まず自分がやったのは「リストの図を書く」こと。実際は紙の上で考えた。

;; 連想リスト:alist  '((foo . 1) (bar . 2))

   +-+    +-+
-->|1|--->|3|--->nil
   +-+    +-+
    |      |
    V      V
   +-+    +-+
   |2|->1 |4|->2
   +-+    +-+
    |      |
    V      V
   foo    bar

;; プロパティリスト:plist  '(foo 1 bar 2)

   +-+   +-+   +-+   +-+
-->|1|-->|2|-->|3|-->|4|-->nil
   +-+   +-+   +-+   +-+
    |     |     |     |
    V     V     V     V
   foo    1    bar    2

なるほど、確かにコンスセル数が同じだ。

で、このコンスセルを増やすことなくリスト操作を行うんだから →各コンスセルのcar/cdrの向きを操作すれば良さそうだ →じゃあrplaca/rplacdを使おう →出来上がり

...と書けば短いのに、それに気づくのに結構時間がかかった上、解答後に他の 人のコードを見てようやくrotatef/setfの存在に気づいたのはナイショです。

所要時間:(1)1時間(2)50分

しかも効率優先のための破壊的操作なのに無駄に再帰を使ったのもマイナスポイント。

CLの無い端末で作業をしていたのでEmacsLispでコーディング。 自宅のubuntu+SBCL 1.0.18+SLIMEでも動作確認しました。今回xyzzy使わなかったな...

2009年5月21日木曜日

「なぜJAVAなのか」と聞かれたら

細かい経緯は面倒なんで省略しますが、自分が大学内でLISPの話題をした際に 「なんでJAVAでLISPを動かす必要があるの?」 と質問されました。

特にこれはLISPに限った話ではなく、「なぜ他の言語をJAVAで実装する必要があるのか」 ということになりそうです。実際、JAVAで実装されたプログラミング言語は多々あります。

  • JRuby(ruby)
  • Rhino(javascript)
  • Jython(python)
  • Kawa(scheme)
  • ABCL(common-lisp)
  • JBasic(basic)

などなど...

で、「なぜJAVAなのか」と聞かれたら「便利だから」と答えたら身も蓋もないし… もうちょっと無い脳みそ振り絞って「何が便利なのか」を考えてみると、

  • 特定のプラットフォームに依存しなくなる
  • JAVAとLISPのコード間で双方アクセスが可能になる
  • 総じてLISPコード資産をJAVAで使える

こんなところでしょうか。("LISP"は各自他のプログラミング言語に置き換えてください)

他にもあると思いますが、自分がパッと思いつくのはこれくらいです。

2009年5月20日水曜日

DICT:2628

ubuntuのgnome-dictionaryが簡易辞書として便利なので紹介。

ほとんどのリソースは外国語なので英英辞書くらいにはなるかなと思っていたら、日本語用の辞書サーバを提供しているところもあるので漢字の読みを調べることも出来そうです。

# もちろん細かく調べるときは手持ちの電子辞書か英辞郎に頼むんですが

Web用のインターフェースもあるのでクライアントをインストールする前に試用してみるのも良いかもしれません。

ちなみに日本語辞書用の辞書サーバなのに、そのサーバはフランスにあるみたい。

2009年5月8日金曜日

今日の無題

ブログの更新遅れも甚だしい今日この頃ですが 、ここにはあんまり技術的でな いどーでもいいことを書くのは自分の性格上ためらってしまうのです。 (どちらかといえば口下手か、単に面倒臭がりなだけなんだと思いますがね)

さすがに Lisp ばかりに手をつけるわけにもいかないので、 とりあえず今はオブジェクト指向の理解のために Java の勉強中。

その他書きたいことがあったような気がしたけど、毎度の事で頭の中でとろけ てしまったみたいなので、今日はこの辺で。
# だめだこの性格…

$ echo *** > /dev/null