ラベル LISP の投稿を表示しています。 すべての投稿を表示
ラベル LISP の投稿を表示しています。 すべての投稿を表示

2010年11月28日日曜日

Shibuya.lisp テクニカルトーク#6 に行ってきました。

11/28に
Shibuya.lisp テクニカルトーク#6
に行ってきました。

今回のTechnical Talksは非常にアカデミックなにおいがすごいして、
内容も難しい部分が多かったですが、
大変興味深い内容でした。

記号処理言語と記述言語 〜 TAO/ELISのアプリケーションから職業大でのIT教育に至る経験談
大野先生の講演。
大学時代の話から、NTT時代の研究、現在の職業大学の教育についてのお話をされていました。
LISPでどういうアプリを作ってきたか(エキスパートシステムや決定木の話)、
TAO/ELISがどういう場面で、どんな風に使われていたのかという話は、ものすごく勉強になりました。
最後の職業カードのシステムを設計はUML/実装はLISP/出力はXMLで行う研究の話も興味深く聞かせていただきました。
懇親会で名刺交換させていただいたときには、自分が通っている会社を存じていてびっくりしました。

CLOS/MOP入門とOWL Full処理系開発事例紹介
CLOS/MOPとOWLの話ですが、
CLOS/MOPの話で時間が取られて、セマンティックWebの部分はあまり聞くことができませんでした。(全部聞きたかった><)
MOP(Meta Object Protocol)はメタクラスがどうのこうのと頭がこんがらがってきてしまって、なかなか理解できませんでした。
小出先生に懇親会で難しくて理解できなかったと正直にいってみましたが、あれは慣れだとのこと。あとでビデオを3回ぐらい見て、自分でコードを動かしてご覧といわれました。早速やってみます!

Lisp今昔物語
LISPが昔どういう風に扱われたか、そして今後プログラミングはどういう風になっていくかという話でした。
安村先生が日立時代のHILISPを作ったときのどのように高速化したか、といった話や、LISPのメリットについてお話しされていました。
後半はこれからのプログラミングについてのお話で、
人間はみんなプログラミングできる能力があるので、一般のひとにもそれができるようにということで、Programming 2.0という概念を提唱されていました。
先生はインターフェースの研究を行っていて、そこから、Programming 2.0といった、緩いプログラミングでもいいんじゃないかという発送につながっていったようです。

LTも面白い話盛りだくさんでした。

Shibuya.lispのスタッフの皆様には、このような機会を設けていただいたことに深く感謝申し上げます。
次回も参加したいなぁ。

2010年10月24日日曜日

Shibuya.lisp Hackathon #1に行ってきました。

Shibuya.lisp Hackathonに参戦してきました。

LISP自体、書くのが久しぶりで、
行く前に久しぶりにちょっと書いてみたら、全然書けなかったので(TT)
いい機会なので、勉強するつもりできました。

当日はもくもくとコードを書いていたので、
もうちょっといろんな人と話せばよかったと思いました。反省。
自分は引っ込み思案でなかなか話しかけられないので、もうちょっとここら辺を克服したいと思います。

最後に成果発表の時間がありましたが、
皆さんの発表見て、「やっぱ格が違うなー。すごいなー。」と思いました。
もっとがんばらないと。


一応テーマとして、
svgをパースして
gauche-glで描画するということをして
勉強しようと思いました。

とにかく、
rectを描画することを目標にがんばり、
なんとか描画するまで行きました(すごく簡単なことなんですけどね;)

以下にコードを晒します。

process_svg.scm

(use sxml.ssax)

(define (translation_rect data)
  (let ((x1 0)
(y1 0)
(x2 0)
(y2 0))
    (map (lambda (x)
  (cond
   ((equal? (car x) 'x)
    (set! x1 (string->number (cadr x)))
    (set! x2 (+ x2  (string->number (cadr x)))))
   ((equal? (car x) 'y)
    (set! y1 (string->number (cadr x)))
    (set! y2 (+ y2 (string->number (cadr x)))))
   ((equal? (car x) 'width)
    (set! x2 (+ x2 (string->number (cadr x)))))
   ((equal? (car x) 'height)
    (set! y2 (+ y2 (string->number (cadr x)))))
   ))
data)
    (list x1 y1 x2 y2)))

(define (get_x1 data)
  (car data))
(define (get_x2 data)
  (caddr data))
(define (get_y1 data)
  (cadr data))
(define (get_y2 data)
  (cadddr data))

(define (process_element elem)
  (case (car elem)
    ('rect (translation_rect (cdr (cadr elem))))
    ('circle (print "circle"))
    ('line (print "line"))))

(define (parser data)
  (process_element
   (car (cdr (car (cdr (ssax:xml->sxml (open-input-string data) '())))))))


main.scm

(use gl)

(use gl.glut)
(load "./process_svg.scm")

(define setup-data
  (map 
   (lambda (x) (/ x 250))
   (parser "<svg><rect height="100" width="100" x="10" y="10"></rect></svg>")))

(define (disp)
  (let ((x setup-data))    
    (print x)
    (gl-clear-color 0.0 0.0 0.0 0.0)
    (gl-clear GL_COLOR_BUFFER_BIT)
    (gl-color 1.0 0.0 0.0)
    (gl-ortho 0.0 1.0 1.0 0.0 -1.0 1.0)
    (gl-begin GL_POLYGON)
    (gl-vertex (get_x1 x) (get_y1 x) 0.0)
    (gl-vertex (get_x2 x) (get_y1 x) 0.0)
    (gl-vertex (get_x2 x) (get_y2 x) 0.0)
    (gl-vertex (get_x1 x) (get_y2 x) 0.0)
    (gl-end)
    (gl-flush)))
(define (keyboard key x y)
  (cond
   ((= key 27) (exit 0))
   ))

(define (main args)
    (glut-init args)
    (glut-init-display-mode GLUT_SINGLE)
    (glut-init-window-size 250 250)
    (glut-create-window "nil window")
    (glut-display-func disp)
    (glut-keyboard-func keyboard)
    (glut-main-loop)
    0)


だいぶ汚いコードですが;
もうちょっとうまく書けるような気がするなー。。。

実行結果は以下です。

とりあえずここまでできたので、
XMLをちゃんと扱えるようにする。
circleといったほかのプリミティブを秒かできるようにする。
アニメーションをできるようにする。
までやりたいなと思います。

早く初心者から脱却したいなー。

(10/30追記)
ソースをGithub に公開しました。 
 
本当はもっとちゃんとしたものになってから公開しようかと思ったんですけど、
そんなこと言ってたらやらないまま終わっちゃいますからね。

2010年3月24日水曜日

Clojure 再帰

Clojureの再帰の書き方

(loop [result [] x 5]
  (if (zero? x)
    result
    (recur (conj result x) (dec x))))
-> [5 4 3 2 1]

loopは別にループをさせるわけではなく、[]に変数の束縛を作って、その後のS式を評価するもので、letとほぼ同じ。ただ、loopは、recurを読んだときに、loopを指定された引数で実行して、再帰を実現するようです。

Clojure マップ

Clojureには、マップというキーと値をペアとして持つコレクションがあります。
例えば、
{"x" "a" "y" "b"}
とかき、xがキーでその対応する値がa, yがキーでその対応する値がbとなります。キーと値を交互に書くわけです。

キーにはキーワード(:xxx)がよくつかわれます。
{ :first-name "Saki" :family-name "Aibu"}
みたいに。

マップは関数としても使えます。

(def girl { :first-name "Saki" :family-name "Aibu"})
(girl :first-name)
みたいに。

で、Clojureには分配束縛っていうものがあって、必要なものだけバインドすることができます。

(defn greet-author [{fname :first-name}]
  (println "Hello, " fname ))
(greet-author {:first-name "Saki" :family-name "Aibu"})
とかくと、
Hello,Saki
と表示されます。

分配束縛はマップ以外にも使えます。

(let [[x y] [1 2 3]]
  [x y])
これは、[1 2]になります。

2010年3月23日火曜日

Clojure勉強中



「プログラミングClojure」を読みはじめました。

今日はちょっとだけ、2章の真ん中あたりまで読みました。

LISPとの目立った違いは、
  • 関数の書き方が、 (defn func [arg] body)
    のように defn で定義するのと、引数が[]であること。
  • 無名関数の書き方がlamdaじゃなくてfn
  • かっこが少なくて済む
    (cond (< x 10) "less" (> x 10) "more")
    みたいに
です。(まあ、全部shibuya.lispで聞いた話ですが。。。詳細はhttp://shibuya.lisp-users.org/2010/03/21/sltt-5-mov-2/を見た方がいいと思います。。)

「初めての人のためのLISP」が読み終わったばっかりなので、
できれば、ClojureとCommon Lispと、あとSchemeとを比べたいなーっと思ってます。
(時間作ってやりたいな。。。)

2010年3月22日月曜日

Shibuya.lisp テクニカルトーク #5に行ってきました。

Shibuya.lisp テクニカルトーク #5に行ってきました。初参戦!

Shibuya.lispのテクニカルトークは毎回「行きたい!」と思ってたのですが、
ぼやぼやしていていつも満員になっていたので、すごく楽しみでした。

今回は Clojure の話が多かったです。
Clojure は defnとか、引数に[]を使うとか、ちょっと癖のある記法だったので、
敬遠していたのですが、
yshigeruさんの話はわかりやすかったし、hayamizさんが Clojure のいいところの説明をしてくれたので、
すげー興味が湧きました。
それに、JavaVM上で動くってことはGAEでも動くし(これは深町さんもおっしゃってました)、もしかしたらAndroid上でも動くので、覚えておいて損はないかもって思いました。(JVMってすげー。)

で、結局その場で「プログラミングClojure」買っちゃいました☆
読まなくちゃ。

あとコードバトンのコードは読んで勉強したいなと思います。
できれば、次があれば参加したいな!!

本当に楽しかったです!次回も参加したいな!今度は懇親会も出たいな。

2010年3月14日日曜日

初めての人のためのLISP



買っちゃった!