| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「言語まとめ Lisp」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
(ページの作成:「==言語まとめ Lisp== [言語 まとめ][Lisp] 以下から参照、引用 *Emacs Lisp Programing http://www.bookshelf.jp/texi/elisp-intro/jp/emacs-lisp-intro.html…」)
 
1行目: 1行目:
 
==言語まとめ Lisp==
 
==言語まとめ Lisp==
[言語 まとめ][Lisp]
+
[[言語 まとめ][Lisp]]
 
以下から参照、引用
 
以下から参照、引用
 
*Emacs Lisp Programing http://www.bookshelf.jp/texi/elisp-intro/jp/emacs-lisp-intro.html
 
*Emacs Lisp Programing http://www.bookshelf.jp/texi/elisp-intro/jp/emacs-lisp-intro.html
11行目: 11行目:
 
*データとプログラムのどちらも同じ方法で表現する。どちらも、単語や数やリストを空白で区切って括弧で囲んだリストである。  
 
*データとプログラムのどちらも同じ方法で表現する。どちらも、単語や数やリストを空白で区切って括弧で囲んだリストである。  
  
<blockquote>リストの直前に付けた1つのアポストロフィ'を クオートと呼び、リストの直前にこれを付けると、そのリストに関しては何もせずに字面どおりに扱うことをLispに指示する。リストの直前にクオートがない場合には、リストの先頭要素を特別扱いし、コンピュータが従うべきコマンドとなる</blockquote>
+
&lt;blockquote&gt;リストの直前に付けた1つのアポストロフィ'を クオートと呼び、リストの直前にこれを付けると、そのリストに関しては何もせずに字面どおりに扱うことをLispに指示する。リストの直前にクオートがない場合には、リストの先頭要素を特別扱いし、コンピュータが従うべきコマンドとなる&lt;/blockquote&gt;
  
 
===アトム===
 
===アトム===
23行目: 23行目:
 
*リストの直前にクオートがない場合には、リストの先頭要素を特別扱いし、コンピュータが従うべきコマンドとなる。
 
*リストの直前にクオートがない場合には、リストの先頭要素を特別扱いし、コンピュータが従うべきコマンドとなる。
  
  >(+ 1 2)
+
  &gt;(+ 1 2)
 
   
 
   
 
  3
 
  3
59行目: 59行目:
 
====setの使い方====
 
====setの使い方====
 
*シンボルflowersの値としてリスト'(rose violet daisy buttercup)を設定する
 
*シンボルflowersの値としてリスト'(rose violet daisy buttercup)を設定する
  >(set 'flowers '(rose violet daisy buttercup))
+
  &gt;(set 'flowers '(rose violet daisy buttercup))
 
   
 
   
 
  (ROSE VIOLET DAISY BUTTERCUP)
 
  (ROSE VIOLET DAISY BUTTERCUP)
 
   
 
   
  >'flowers
+
  &gt;'flowers
 
   
 
   
 
  FLOWERS
 
  FLOWERS
 
   
 
   
  >flowers
+
  &gt;flowers
 
   
 
   
 
  (ROSE VIOLET DAISY BUTTERCUP)
 
  (ROSE VIOLET DAISY BUTTERCUP)
  
<blockquote>setを使う場合、いずれの引数も評価してほしくない場合には、両方の引数をクオートする必要がある</blockquote>
+
&lt;blockquote&gt;setを使う場合、いずれの引数も評価してほしくない場合には、両方の引数をクオートする必要がある&lt;/blockquote&gt;
  
 
====setqの使い方====
 
====setqの使い方====
77行目: 77行目:
 
*setで第1引数をクオートする組み合わせは多用されるので、スペシャルフォームsetqが用意してある
 
*setで第1引数をクオートする組み合わせは多用されるので、スペシャルフォームsetqが用意してある
 
*setとほとんど同じであるが、第1引数を自動的にクオートするので、引用符をタイプする必要はない
 
*setとほとんど同じであるが、第1引数を自動的にクオートするので、引用符をタイプする必要はない
  >(setq flowers '(rose violet daisy buttercup))
+
  &gt;(setq flowers '(rose violet daisy buttercup))
 
   
 
   
 
  (ROSE VIOLET DAISY BUTTERCUP)
 
  (ROSE VIOLET DAISY BUTTERCUP)
 
   
 
   
  >flowers
+
  &gt;flowers
 
   
 
   
 
  (ROSE VIOLET DAISY BUTTERCUP)
 
  (ROSE VIOLET DAISY BUTTERCUP)
 
*さらに、setqは、複数の異なる変数に異なる値を代入するためにも使える。
 
*さらに、setqは、複数の異なる変数に異なる値を代入するためにも使える。
  >(setq alpha '(a b c)
+
  &gt;(setq alpha '(a b c)
 
         num  '(1 2 3))
 
         num  '(1 2 3))
 
   
 
   
 
  (1 2 3)
 
  (1 2 3)
 
   
 
   
  >alpha
+
  &gt;alpha
 
   
 
   
 
  (A B C)
 
  (A B C)
 
   
 
   
  >num
+
  &gt;num
 
   
 
   
 
  (1 2 3)
 
  (1 2 3)
106行目: 106行目:
 
  defun 関数名 (引数) "関数の説明(省略可)" 関数本体
 
  defun 関数名 (引数) "関数の説明(省略可)" 関数本体
 
=====例=====
 
=====例=====
  >(defun pow (x) "power" (* x x))
+
  &gt;(defun pow (x) "power" (* x x))
 
   
 
   
 
  POW
 
  POW
 
   
 
   
  >(pow 2)
+
  &gt;(pow 2)
 
   
 
   
 
  4
 
  4
121行目: 121行目:
 
     真の場合の動作)
 
     真の場合の動作)
 
=====例=====
 
=====例=====
  >(if (> 5 4)
+
  &gt;(if (&gt; 5 4)
 
     '("5 is greater than 4"))
 
     '("5 is greater than 4"))
 
   
 
   
 
  ("5 is greater than 4")
 
  ("5 is greater than 4")
 
   
 
   
  >(if (> 5 6)
+
  &gt;(if (&gt; 5 6)
 
     '("5 is greater than 4"))
 
     '("5 is greater than 4"))
 
   
 
   
132行目: 132行目:
 
===If--then--else式===
 
===If--then--else式===
 
*if式には第3引数を指定することもでき、判定条件が 偽の場合の動作である。
 
*if式には第3引数を指定することもでき、判定条件が 偽の場合の動作である。
  >(setq x 2)
+
  &gt;(setq x 2)
 
   
 
   
 
  2
 
  2
 
   
 
   
  >(if (= x 1)
+
  &gt;(if (= x 1)
 
     '("x is 1")
 
     '("x is 1")
 
     '("x is not 1"))
 
     '("x is not 1"))

2020年2月15日 (土) 07:59時点における版

言語まとめ Lisp

[[言語 まとめ][Lisp]] 以下から参照、引用

リスト処理

リスト

  • リストを以下のように書く
'(rose violet daisy buttercup)
  • データとプログラムのどちらも同じ方法で表現する。どちらも、単語や数やリストを空白で区切って括弧で囲んだリストである。

<blockquote>リストの直前に付けた1つのアポストロフィ'を クオートと呼び、リストの直前にこれを付けると、そのリストに関しては何もせずに字面どおりに扱うことをLispに指示する。リストの直前にクオートがない場合には、リストの先頭要素を特別扱いし、コンピュータが従うべきコマンドとなる</blockquote>

アトム

  • これまで単語と呼んできたものをアトム(atoms)と呼ぶ。
  • リストでは、アトムを空白で区切る。アトムは、括弧のすぐ隣にあってもよい。
  • リストは、たった1個のアトムを含むだけでも、まったく含まなくてもよい。
  • 何も含まないリストは()のように書き、空リスト(empty list)と呼ぶ。
  • 空リストは、それ以外のものとは異なり、アトムであると同時にリストでもある。

プログラムの実行

  • リストの直前にクオートがない場合には、リストの先頭要素を特別扱いし、コンピュータが従うべきコマンドとなる。
>(+ 1 2)

3

シンボル名と関数定義

  • +のようなシンボルは、それ自身はコンピュータが実行すべき命令列ではない
  • 定義、すなわち、命令列を探すためにシンボルを(一時的に)使う

インタープリタ

基本動作

  1. リストの直前にクオートがあるかどうかを調べる。
  2. クオートがあれば、リストを返すだけ。
  3. クオートがなければ、インタープリタはリストの先頭要素を調べ、それに関数定義があるかどうかを調べる。
  4. 関数定義があれば、インタープリタはその関数定義内の命令列を実行する。
  5. さもなければ、インタープリタはエラーメッセージを出力する。

特別な動作

変数
  • リストに加えて、クオートもせず括弧で囲まれてもいないシンボルを評価できる
  • 変数(variable)としてのシンボルの値を決定しようとする
スペシャルフォーム
  • 特殊な関数があり、これらは普通の方式のように動作しない。これらをスペシャルフォーム(special forms)と呼ぶ。関数の定義などの特殊なことを行うものであり、それらの個数は多くはない。
ネストしたリスト
  • インタープリタが探しあてた関数がスペシャルフォームでなく、しかも、それがリストの一部である場合には、 Lispインタープリタはリストの内側にリストがあるかどうかを調べる。内側にリストがあれば、Lispインタープリタは内側のリストを処理してから、外側のリストを処理する。

引数

データ型

  • 関数に渡すデータの型は、関数が使用する情報の種類に応じて決まる。
  • +は数を加算するので、 +のような関数への引数は数値である必要がある。

引数としての変数やリストの値

  • 引数は、評価したときに値を返すシンボルでもよい。

可変個数の引数

  • +、*などのある種の関数は、任意個数の引数を取る

変数

値の設定

  • setかsetqを使う
  • letを使う

setの使い方

  • シンボルflowersの値としてリスト'(rose violet daisy buttercup)を設定する
>(set 'flowers '(rose violet daisy buttercup))

(ROSE VIOLET DAISY BUTTERCUP)

>'flowers

FLOWERS

>flowers

(ROSE VIOLET DAISY BUTTERCUP)

<blockquote>setを使う場合、いずれの引数も評価してほしくない場合には、両方の引数をクオートする必要がある</blockquote>

setqの使い方

  • 実用上、setの第1引数をほとんどつねにクオートするはず
  • setで第1引数をクオートする組み合わせは多用されるので、スペシャルフォームsetqが用意してある
  • setとほとんど同じであるが、第1引数を自動的にクオートするので、引用符をタイプする必要はない
>(setq flowers '(rose violet daisy buttercup))

(ROSE VIOLET DAISY BUTTERCUP)

>flowers

(ROSE VIOLET DAISY BUTTERCUP)
  • さらに、setqは、複数の異なる変数に異なる値を代入するためにも使える。
>(setq alpha '(a b c)
       num   '(1 2 3))

(1 2 3)

>alpha

(A B C)

>num

(1 2 3)

関数定義

defun

  • シンボルには、関数として呼ばれたときにコンピュータが実行するコードが結び付けられている。
  • このコードを関数定義(function definition)と呼び、シンボルdefun(define function(関数を定義する)の略)で始まる Lispの式を評価することで作成する
  • defunは、その引数を通常のようには評価しないので、 スペシャルフォーム(special form)と呼ばれる。
書式
defun 関数名 (引数) "関数の説明(省略可)" 関数本体
>(defun pow (x) "power" (* x x))

POW

>(pow 2)

4

条件判定

if

書式
  • 第1要素がifであるリストの第2要素と第3要素のそれぞれに、判定条件と真の場合の動作を指定する。
(if 判定条件
    真の場合の動作)
>(if (> 5 4)
    '("5 is greater than 4"))

("5 is greater than 4")

>(if (> 5 6)
    '("5 is greater than 4"))

NIL

If--then--else式

  • if式には第3引数を指定することもでき、判定条件が 偽の場合の動作である。
>(setq x 2)

2

>(if (= x 1)
    '("x is 1")
    '("x is not 1"))

("x is not 1")

偽について