SlideShare a Scribd company logo
Lisp tutorial for Pythonista.
Day #1 : Gentlemen, Start your engine.




                                                         Ransui Iso
                          Strategic Technology Group, X-Listing Co, Ltd.
これから Lisp の話をします
Lisp の歴史とか概要
Wikipedia でも読んどいて下さい
それでも覚えておきたい
 Lisp の神々のお姿
John McCarthy
Richard M. Stallman
Guy L Steel Jr.
Paul Graham
その他にも神はいっぱいいる
 しかも全員超絶 Hacker
Lisp は難しいって良く聞くよ!
   そんな Super Hacker 向け言語を、
 ( 僕 | 私 ) も使えるようになるのかな?
Lisp は実用言語!怖くないよ!
 ちょっと加齢臭のするとこはあるけどな!
Lisp は長年使われてきたので
     その時々の流行とか
      知恵が詰まってる

 ちょっと詰め込みすぎで整理できてない感もある
先人の知恵を拝借して楽できるということでもある
商用 Lisp 処理系売ってる会社は
        食えている
   粛々とお仕事に Lisp を使っている
     たくさんの人たちがいる

      我々はオタクの腐海に
  孤独に漕ぎ出そうとしているんじゃない
で、本題。
Pythonista のための Lisp 入門
今日は最初なのでイントロだけ
対象は Common Lisp
対象は Common Lisp

          処理系はいろいろあるけど
SteelBank Common Lisp というやつを使いますよ
対象は Common Lisp

Scheme とかいう象牙の塔は今のところ無視してかまいません
対象は Common Lisp
Emacs Lisp は本物の Lisp ですが古文・漢文の世界です
       現代文を学んでいる間は忘れましょう
Lisp→Python→Lisp
 な俺から言わせると
Python を使えるなら
Lisp なんて余裕じゃね?
   とか思うんです。
Python と Lisp は意外と似てるしな!

            そりゃそうだよ
      Python のほうが新しい言語で
        いろんな言語のいい所を
    上手に取捨選択して取り込んでるもの
では、まず
関数とか見てみる
ぱいそん
def fact(x):
    result = 0L
    for i in xrange(1, x + 1):
        result *= i
    return result




りすぷ
(defun fact(x)
    (if (< x 1) 1 (* x (fact (1- x))) ))
ぱいそん
def fact(x):
    result = 0L
    for i in xrange(1, x + 1):
        result *= i
    return result




りすぷ
(defun fact(x)
    (if (< x 1) 1 (* x (fact (1- x))) ))



  カッコつけて再帰とか使わなくてもいいよ!
ぱいそん
def fact(x):
    result = 1
    for i in xrange(1, x + 1):
        result *= i
    return result




りすぷ
(defun fact(x)
  (let ((result 1))
    (loop for i from 1 to x do
         (setf result (* result i)))
    result))
ぱいそん
def fact(x):
    result = 1
    for i in xrange(1, x + 1):
        result *= i
    return result




りすぷ
(defun fact(x)
  (let ((result 1))
    (loop for i from 1 to x do
         (setf result (* result i)))
  Common Lisp は「ループ上等」な世界
    result))
末尾再帰原理主義者の戯言はガン無視してよし!
確かに似てはいる…しかし…
そんなに括弧ばかりで大丈夫か?
大丈夫だ。問題ない。

     Python のインデントの代わりに
      括弧を使っていると思えばいい

普通はエディタがよろしくインデントしてくれるしな!
さっきの例はあまりにアレなので
もうすこしカッコつけた fact 関数
(defun fact(x)
  (apply #'* 
     (loop for i from 1 to x collect i)))



      ベタなループでチマチマ掛け算なんて
           小学生までよねー

                 って感じ?
で、最初の単純ループ版と
さっきのカッコつけバージョンの
  コンパイル結果を見ると
単純ループ版   157bytes
カッコつけ版   440bytes
m9(^Д^)

素直に書くって大事!
気を取り直して
データ型とか見てみる
ぱいそん
l = [1, "a", "b", ["ham", "spam"], 5]
l[0]          → 1
l[1:]         → ['a', 'b', ['ham', 'spam'], 5]
l[3]          → ['ham', 'spam']
l[3][0]       → 'ham'
5 in l        → True

for x in l: print x

りすぷ
(setf l '(1 "a" "b" ("ham" "spam") 5)
(car l)           → 1
(cdr l)           → ("a" "b" ("ham" "spam") 5)
(cadddr l)        → ("ham" "spam")
(car (cadddr l)) → "ham"
(member 5 l)      → (5)

(loop for x in l do (print x))
ぱいそん
d = dict()
d["Hello"] = "World"
d["Hello"] → "World"
d[1] = 2
len(d) → 2
for (key, value) in d.items():
    print("%s : %s" % (key, value))


りすぷ
(setf d (make-hash-table :test #'equal))
(setf (gethash "Hello" d) "World)
(gethash "Hello" d) → "World"
(setf (gethash 1 d) 2)
(hash-table-count d) → 2
(maphash #'(lambda (key value)
             (princ (format nil "~a : ~a~%" key value))) d)
ぱいそん
class Greeting(object):
    def __init__(self):
        self.name = None
    def setName(self, name):
        self.name = name
    def hello(self, name=None):
        print("Hello %s!" % name if name else self.name)
obj = greeting()
obj.hello(name="World")

りすぷ
(defclass Greeting ()
    ((name :initform nil)))
(defmethod set-name ((self Greeting) name)
    (setf (slot-value self 'name) name))
(defmethod hello ((self Greeting) &key name)
    (princ (format nil "Hello ~a!~%"
             (or name (slot-value self 'name)))))
(setf obj (make-instance 'Greeting)
(hello obj :name "World")
…… なんか、全然違くね?
見た目に騙されてはイカ〜ン!
 機能としては同じものが提供されてるし
       面倒な部分は
   言語そのものをカスタマイズ
     してしまえば無問題!
言語そのものをカスタマイズするだって?
言語そのものをカスタマイズ!?
(setf count 10)
(do () ((<= count 0))
  (print count)
  (setf count (1- count))


(defmacro while (test-exp &body body)
    `(do ()
        ((not ,test-exp)) ,@body))

(setf count 10)
(while (>= count 0)
    (print count)
    (setf count (1- count)) )


(defmacro for ((init-exp test-exp update-exp) &body body)
    `(do ((,@init-exp ,update-exp))
        ((not ,test-exp)) ,@body))

(for ((count 10) (> count 0) (decf count 1))
    (print count))
構文要素を自由に追加できるよ!

 こういうのは関数とかライブラリとかじゃ
         実現不能
「めんどくせーなー」
と思ったら俺様流にカスタマイズ
       これ!
ただしやりすぎると
  他人がまったく読めない
謎言語に変貌するという諸刃の剣
素人にはお勧めできない
けど、使い所をちゃんと心得てればホントに便利な機能!
   macro については後日詳しく勉強するよ!
その他の Python と Lisp の対応は

「 Lisp プログラマのための Python 入門」
                   by Peter Norvig

                       を見てね!

http://www.unixuser.org/~euske/doc/python/python-lisp-j.html
と、簡単に Lisp を紹介したので
 実際に Lisp をお勉強する
   環境の話をします
準備するお道具

●   SBCL
●   Emacs
●   quicklisp
●   Windows を端末にしたい場合は
     ●   Xming
     ●   PuTTY の適切な設定
SBCL のインストール

●       emerge sbcl

    –   できるだけ新しいのを使いたいので ~amd64 すべし
    –   USE フラグは threads と unicode は必須で
    –   インストールできたら ~/.sbclrc ファイルを作成&編集

;; -*- coding: utf-8 -*-
(setf sb-impl::*default-external-format* :utf-8)
(setf sb-alien::*default-c-string-external-format* :utf-8)
Emacs のインストール

●   vi 派の人。ごめん、やっぱ Emacs 便利なんで。
●   ~amd64 はしなくていいです。
●   USE フラグとかは
     capella で equery uses emacs とかして調べてね!
●   あと、日本語入力のために USE フラグに emacs
    を指定して emerge anthy
●   自分の ~/.emacs.el 持ってない人は
    ~ransui/.emacs.el コピーして適当に編集して使っ
    て下さい。
QuickLisp のインストール

●   PyPi みたいなもん
●   wget http://beta.quicklisp.org/quicklisp.lisp
●   sbcl --load quicklisp.lisp
      ●   (quicklisp-quickstart:install)
      ●   ややあって
      ●   (ql:add-to-init-file)
      ●   (ql:quickload "quicklisp-slime-helper")
      ●   (quit)
Xming のインストール

●       ここから DL してインストール
    –   http://www.straightrunning.com/XmingNotes/

●       PuTTY の 設定パネルで
         ●   接続→ SSH→X11 で
         ●   X11 フォワーディング:チェック
         ●   X ディスプレイの場所 localhost:10

    –   鯖側の sshd_conf で X11Forwarding が有効になってい
         るかを確認
Eclipse 使いたいひと向け情報

●       cusp っていう Lisp 用の Plug-in があるらしい
    –   情報は
         ●   http://bitfauna.com/projects/cusp/index.html   
             にある。

●       dandelion ってのもあるらしい
    –   情報は
         ●   http://sourceforge.net/projects/dandelion-ecl/


●       使ってみた人、感想希望
    –   もし超イケてるのであれば、 Emacs から乗り換えも有り
参考書

●       ふくちゃんのブログ見てね!
    –   http://caddr.blog98.fc2.com/

●       最初のお勧めは
    –   Common Lisp 入門
    –   実践 Common Lisp

●       On Lisp はオンラインで読める
    –   http://www.komaba.utmc.or.jp/~flatline/onlispjhtml/
    –   けど、このテキストは Lisp の基礎は分かってるレベルを想定してる
宿題

●   Emacs + SLIME もしくは eclipse とかの環境を
    ちゃんと作っておいてね!

●   次回から実際にプログラム書きます

●   どういう形式でやるかは考え中
     ●   ハンズオン形式?
     ●   全員がノート PC 持ってるわけじゃないし…

More Related Content

PDF
One - Common Lispでもワンライナーしたい
PDF
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
PDF
Inquisitor -Common Lispに文字コード判定を-
PDF
LLdeade Python Language Update
PDF
中3女子が狂える本当に気持ちのいい constexpr
PDF
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
PDF
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
PDF
すごい constexpr たのしくレイトレ!
One - Common Lispでもワンライナーしたい
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Inquisitor -Common Lispに文字コード判定を-
LLdeade Python Language Update
中3女子が狂える本当に気持ちのいい constexpr
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
すごい constexpr たのしくレイトレ!

What's hot (19)

PDF
Constexpr 中3女子テクニック
PDF
constexpr idioms
PDF
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜
PDF
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
PDF
NumPyが物足りない人へのCython入門
PDF
Cython ことはじめ
PDF
Wrapping a C++ library with Cython
PDF
Scalaのオブジェクトの話
PDF
Cython intro prelerease
PDF
Python 機械学習プログラミング データ分析ライブラリー解説編
PDF
Boost tour 1.60.0 merge
PDF
boost::shared_ptr tutorial
KEY
core dumpでcode golf
PDF
Boost Tour 1.48.0 diff
KEY
ひのきのぼうだけで全クリ目指す
PDF
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
PPT
Altanative macro
PDF
C++のライブラリを簡単に眺めてみよう
PDF
リテラル文字列型までの道
Constexpr 中3女子テクニック
constexpr idioms
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
NumPyが物足りない人へのCython入門
Cython ことはじめ
Wrapping a C++ library with Cython
Scalaのオブジェクトの話
Cython intro prelerease
Python 機械学習プログラミング データ分析ライブラリー解説編
Boost tour 1.60.0 merge
boost::shared_ptr tutorial
core dumpでcode golf
Boost Tour 1.48.0 diff
ひのきのぼうだけで全クリ目指す
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
Altanative macro
C++のライブラリを簡単に眺めてみよう
リテラル文字列型までの道
Ad

Similar to Lisp tutorial for Pythonista : Day 1 (20)

PDF
Lisp Tutorial for Pythonista Day 6
PDF
Lisp tutorial for Pythonista : Day 2
PDF
これからの「言語」の話をしよう ―― 未来を生きるためのツール
PDF
謎の言語Forthが謎なので実装した
PDF
Lisp Tutorial for Pythonista : Day 3
PDF
Material
ODP
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
PDF
普通のプログラミング言語R
PPT
ZFSのソースコードをチラ見してみる
PPT
2008.10.18 L4u Tech Talk
PDF
What is Metasepi?
PDF
Lisp study
PDF
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
PDF
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
ODP
(define)なしで再帰関数を定義する
PDF
Subprocess no susume
PDF
OpenStack + Common Lisp
PDF
HPC Phys-20201203
PDF
関数型志向Python - LLまつり2013
PPTX
もしも… Javaでヘテロジニアスコアが使えたら…
Lisp Tutorial for Pythonista Day 6
Lisp tutorial for Pythonista : Day 2
これからの「言語」の話をしよう ―― 未来を生きるためのツール
謎の言語Forthが謎なので実装した
Lisp Tutorial for Pythonista : Day 3
Material
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
普通のプログラミング言語R
ZFSのソースコードをチラ見してみる
2008.10.18 L4u Tech Talk
What is Metasepi?
Lisp study
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
(define)なしで再帰関数を定義する
Subprocess no susume
OpenStack + Common Lisp
HPC Phys-20201203
関数型志向Python - LLまつり2013
もしも… Javaでヘテロジニアスコアが使えたら…
Ad

More from Ransui Iso (12)

PPTX
「Pythonでやってみた」~広がるプログラミングの愉しみ~
PDF
Pythonで作る俺様サウンドエフェクター
PDF
アドテクを支える人と技術
PDF
Playing with curses
PDF
小中学生Hack-a-thonにオッサンが乗り込んだ話
PDF
XML-RPC : Pythonが「電池付属」と呼ばれる理由
PDF
ソフトシンセを作りながら学ぶPythonプログラミング
PDF
Introduction of ToySynth
PDF
PyQtではじめるGUIプログラミング
PDF
PySynth : A toy pure python software synthesizer.
PDF
Lisp Tutorial for Pythonista : Day 5
PDF
Lisp Tutorial for Pythonista : Day 4
「Pythonでやってみた」~広がるプログラミングの愉しみ~
Pythonで作る俺様サウンドエフェクター
アドテクを支える人と技術
Playing with curses
小中学生Hack-a-thonにオッサンが乗り込んだ話
XML-RPC : Pythonが「電池付属」と呼ばれる理由
ソフトシンセを作りながら学ぶPythonプログラミング
Introduction of ToySynth
PyQtではじめるGUIプログラミング
PySynth : A toy pure python software synthesizer.
Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 4

Lisp tutorial for Pythonista : Day 1