lisp を勉強すると良いことがあるよ!←特にJavaScriptやC#などlambda式をサポートしている言語を使っている人。

JUGEMテーマ:コンピュータ

最近、lisp の勉強を再開した。
On Lisp を少し前に最後まで読んだので、今度は Let Over Lambda Edition 1.0 を読んで勉強している。
最近は仕事が忙しくないので、業務時間中に「仕事に影響が出ない範囲で」本を読むことにしている。

lisp ハッカーの思想は最近の言語の設計・デザインパターンなどにも影響を与えているようで、非常に参考になる。
おかげで、emacs上で動くユーティリティも開発できるようになったし、
実際の業務でも、プログラミングスキル&知識が向上したと実感できるようになった。
1.JavaScriptを使ったWebアプリ開発で、クロージャを使ったテクで非同期コールバック関数を効率良く実装できた。
  クロージャの使い方なんてJavaScriptの本やWebサイトになかったからね...
2.C(or C++)言語のマクロをどのような状況で使えばいいか判断できるようになった。
  マクロの使い方なんてlispの本以外ほとんど見たことがなかったし...
3.最近の言語でよく出てくラムダ式(lispだとlambda関数)の意味を説明されなくても分かるようになる。
  これは結構重要。MicrosoftのC#なんかでも使われるようになったので仕事でも大事だYO!
  知ってないとまったく理解できない考え方だからなあ。
  特にクロージャ。

大学などの講義や課題に時間が取れる教育の現場では、是非、Lisp(特にクロージャ&マクロ)を教えて欲しいと思う。
現代の言語の元になった思想を学べるため、「なぜ」と思ったことに対して安直な答えではなく、
背景にある考え方を知ることが出来るので、時間はかかるが知識が確実に頭に入るようになる。
そして、そこから別のことに対しての興味が広がり...というように学生たちの知識が深くなっていくことが期待できる。
時間が許せば、是非やって欲しい。
時間はかかるし、理解できない人は必ず出てくるだろうが...
 

Common Lisp 勉強中 ...

JUGEMテーマ:コンピュータ

最近、Common Lisp の勉強を始めた。

この本で勉強中。
実践Common Lisp
http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Common-Lisp-Peter-Seibel/dp/4274067211
あとで On Lisp を見る予定。

GNU Emacs を使っていたので、そこからの流れだ。

いままで見てきた言語とは異なり、かなり言語仕様が練りこまれているようだ。

特に、コンディションシステムには感心させられた。
単純なtry〜catchだけではなく、リカバリーやリスタートまで考えられているのには恐れ入った。

業務に使用するソフトウェアに関しては、エラー処理にかなり悩まされるので、このような言語側でのサポートがあると非常に助かる。

また、かなり練りこまれたオブジェクト指向の仕組みがあることも、気に入ったポイントだ。
ほぼどんな機能に関しても、かなり細かく制御できるところが気に入った。
メンテナンス性がかなり高いクラスを作成することができそうだ。

そして、協力無比な「マクロ」があれば言語の機能を無限に拡張できる。
(シンタックスの拡張さえできる!)
このマクロがあるおかげで長い間愛されているんだろうと思う。

機会があればLispで仕事をしてみたい。

Echo Server on GNU Emacs 23.1(W32)

simple echo server code on GNU Emacs 23, following.
* cleanup version

--
(defun echo-get-buffername-from-process-name (str)
"Return Process Buffer Name from Process name.

ex. from following
Echo-Server-30000 <127.0.0.1:1791>

-> returns: Echo-Server-30000"
(replace-regexp-in-string " <.*$" "" str))

(defun echo-get-portnum-from-process-name (str)
"Return Port Number from Process name.

ex. from following
Echo-Server-30000 <127.0.0.1:1791>

-> returns: 1791"
(replace-regexp-in-string "^.*:¥¥(.*¥¥)>$" "¥¥1" str))

(defun echo-filter (proc string)
"Echo Server communication filter (callback function)"
(let ((buffername (echo-get-buffername-from-process-name (process-name proc)))
(portno (echo-get-portnum-from-process-name (process-name proc))))
(with-current-buffer buffername
(end-of-buffer)
(insert (format "Received(local port number:%5s): %s" portno string))
(process-send-string proc string)
(insert (format "Sent (local port number:%5s): %s" portno string)))))

(defun echo-start-server (addr, port)
"Start Echo Server."
(interactive "sServer IP Address=¥nnServer Port Number=")
(let ((proc-name (format "Echo-Server-%d" port))
(proc))
(setq proc (make-network-process :name proc-name
:host 'local
:service port
:type nil
:nowait t
:server t
:filter 'echo-filter
))
(set-process-buffer proc (get-buffer-create (process-name proc)))
(display-buffer (process-buffer proc))))

Simple Echo Server on GNU Emacs 23

Emacs でソケット通信可能ということだったので試してみた。
以下のように書くと、TCP/IPソケットのサーバーが立ち上がり、

(make-network-process :name "Test-Server"
:buffer "* Socket Data *"
:host 'local
:service 30000
:type nil
;;:family local
;; :coding
:nowait t
:server t)

クライアントからコネクションが張られる(telnet localhost 30000とか)と、

* Socket Data * <127.0.0.1:1437>

というような名前のバッファが作られて、そこへ受信データが表示された。

フィルターなんかをちゃんと書けば、通信のテスト用アプリを作成できそうだ。

ちゃんと非同期動作できているので本格的なサーバーアプリも作れそうである。

とりあえず、簡易エコーサーバーを作ってみた。

test-server へサーバー名とポート番号を与えると待ちうけを開始する。

エディタ内で通信アプリを動かすのは楽しいということが分った。
(test-server 'localhost 30000) で動かして、
telnet localhost 30000 で接続した場合の画面とソースコードは以下の通り。

画面
--
Simple Echo Server on GNU Emacs 23

ソースコード
--
(defun get-portnum (str)
"Return Port Number from Process name.

ex. from following
Test-Server-30000 <127.0.0.1:1791>

-> returns: 1791"
(let ((num))
(setq num (replace-regexp-in-string "^.*:" ""
str))
(setq num (replace-regexp-in-string ">" ""
num))
))

(defun test-filter (proc string)
(let ((buffer (process-name proc))
(portno)
(senddata))
(setq portno (get-portnum (process-name proc)))
(setq buffer (replace-regexp-in-string " .*$" "" buffer))
(display-buffer buffer)
(with-current-buffer buffer
(end-of-buffer)
(insert (format "Received(%5s): %s" portno string))
(setq senddata (format "Send (%5s): %s" portno string))
(process-send-string proc senddata)
(insert senddata)
;;(delete-process process) ; コネクションを切断する
)
))

(defun test-server (addr, port)
"Start Echo Server."
(interactive "sIP Address=¥nnPort Number=")
(let ((proc-name (format "Test-Server-%d" port))
(proc))
(setq proc (make-network-process :name proc-name
;;:buffer proc-name
:host 'local
:service port
:type nil
;;:family local
;; :coding
:nowait t
:server t
:filter 'test-filter
))
(set-process-buffer proc (get-buffer-create (process-name proc)))
(display-buffer (process-buffer proc))
))

1

calendar

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
2930     
<< November 2020 >>

selected entries

categories

archives

recent comment

  • 多機能携帯電話の発注はもうやめて!携帯メーカーのライフはもうゼロよ!
    momonga
  • 小沢が幹事長を辞任するそうだが、議員辞職しないと意味がない。
    死神
  • 「小沢死ね」で検索してくる人が増えている件
    死神
  • 小沢死すべし
    seniorbrother
  • 小沢死すべし
    死神
  • 小沢元代表強制起訴キタ━━━━━━(゚∀゚)━━━━━━!!!!!
    死神
  • 今日は大東亜戦争開戦の日か...
    seniorbrother
  • 今日は大東亜戦争開戦の日か...
    死神
  • 今日は大東亜戦争開戦の日か...
    seniorbrother
  • 民主党独裁は十分駄目だが、小沢が首相になるのは本当にまずい。実現したら日本が終わる...
    seniorbrother

recent trackback

recommend

recommend

recommend

recommend

links

profile

書いた記事数:503 最後に更新した日:2017/01/29

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM