Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Common Lisp入門

991 visualizaciones

Publicado el

Common Lispの入門スライド。作成者はCoil

Publicado en: Ingeniería
  • Inicia sesión para ver los comentarios

  • Sé el primero en recomendar esto

Common Lisp入門

  1. 1. Lisp入門
  2. 2. 対象 • 他言語を触ったことがある • Lispは完全ノータッチ
  3. 3. 環境 • Common Lisp • iTerm2(Terminal) • clisp
  4. 4. 今日覚える用語 • リスト • アトム • S式 • コンスセル • ドット対 • シンボル
  5. 5. Lispって何?
  6. 6. Lispとは • ((括弧)が((沢山(ある))言語)) •
  7. 7. Lispとは • ((括弧)が((沢山(ある))言語)) • ジョン・マッカーシーが考案(1956) •
  8. 8. Lispとは • ((括弧)が((沢山(ある))言語)) • ジョン・マッカーシーが考案(1956) • スティーブ・ラッセルがevalを実装(1958) •
  9. 9. Lispとは • ((括弧)が((沢山(ある))言語)) • ジョン・マッカーシーが考案(1956) • スティーブ・ラッセルがevalを実装(1958) • FORTRAN 1954 FORTRAN 1957
  10. 10. Lispとは • ((括弧)が((沢山(ある))言語)) • ジョン・マッカーシーが考案(1956) • スティーブ・ラッセルがevalを実装(1958) • FORTRAN 1954 2 番 1 番 FORTRAN 1957
  11. 11. Lispとは • ((括弧)が((沢山(ある))言語)) • ジョン・マッカーシーが考案(1956) • スティーブ・ラッセルがevalを実装(1958) • Lisp Processorの略 FORTRAN 1954 2 番 1 番 FORTRAN 1957
  12. 12. List Processor Lisp 略して
  13. 13. リストとは • (括弧で囲まれたもの) • S式の一つ
  14. 14. S式とは • Symbol Expressionの和名 • データを扱うS式、プログラムを扱うM式(Meta Expression) •
  15. 15. S式とは • Symbol Expressionの和名 • データを扱うS式、プログラムを扱うM式(Meta Expression) • リストとアトム
  16. 16. アトムとは • (括弧)で囲まれてないもの • リスト以外全部アトム
  17. 17. (list 1 2 (list 3 4))
  18. 18. (list 1 2 (list 3 4)) ;=>(1 2 (3 4))
  19. 19. (list 1 2 (list 3 4)) ;=>(1 2 (3 4)) atom list
  20. 20. (list 1 2 (list 3 4)) ;=>(1 2 (3 4)) atom list atom list
  21. 21. (list 1 2 (list 3 4)) ;=>(1 2 (3 4)) atom atom
  22. 22. リスト アトムってあるの?
  23. 23. リスト アトムってあるの? • NIL • 'NIL • '() • ()
  24. 24. リスト アトムってあるの? • NIL • 'NIL • '() • () 空リストとnilはアトムであり、リストである
  25. 25. リスト アトム NIL 'NIL () '() S式
  26. 26. nilがリストで何が嬉しいか (append 'nil 'nil) (append '(1 2) '(3 4))
  27. 27. nilがリストで何が嬉しいか (append 'nil 'nil) (append '(1 2) '(3 4)) リスト 限定
  28. 28. nilがリストで何が嬉しいか (append 'nil 'nil) ;=>NIL (append '(1 2) '(3 4)) ;=>(1 2 3 4) リスト 限定
  29. 29. nilがリストで何が嬉しいか (append 'nil 'nil) ;=>NIL (append '(1 2) '(3 4)) ;=>(1 2 3 4) リストの中身が空でも同じように扱える リスト 限定
  30. 30. 確かめてみよう • Terminalにclispと入力 • 起動したら型を確認する関数typepを使ってみる
  31. 31. • (typep nil 'list) • (typep 'nil 'list) • (typep () 'list) • (typep '() 'list)
  32. 32. Common Lispの 真偽値ってどうなってるの?
  33. 33. boolean • trueはT • falseはNIL • nilもNIL
  34. 34. (typep nil 'list)
  35. 35. (typep nil 'list) 関数名 引数
  36. 36. (typep nil 'list) 引数 クオートすると評価されない 関数名
  37. 37. (typep nil 'list) 引数 クオートすると評価されない データモード 関数名
  38. 38. (typep nil 'list) 引数 リスト フォーム 関数名
  39. 39. (typep nil 'list) 引数 リスト フォーム クオートしてない 関数名
  40. 40. (typep nil 'list) 引数 リスト フォーム クオートしてない 関数名 コードモード
  41. 41. (関数名 arg1 arg2 …) 関数のリストフォーム
  42. 42. リストフォームとは • (コマンド arg1 arg2 arg3 ……) • 関数呼出フォーム • 特殊フォーム • マクロフォーム 25種類 たくさん たくさん
  43. 43. well-formedなフォームが 3種類しかないって?
  44. 44. アトムとリストなら S式じゃなかったの?
  45. 45. S式 Lispフォーム S式とLisp
  46. 46. S式 Lispフォーム ("foo" 1 2) (foo 1 2) S式とLisp
  47. 47. これもS式(not lisp) • ((my (book)) is expensive) • (彼 は (あの ((美しい) 丘) の (風車 の ある (家))) に 20 年 住んで いる)
  48. 48. リストフォームとは • (コマンド arg1 arg2 arg3 ……) • 関数呼出フォーム • 特殊フォーム • マクロフォーム 25種類 たくさん たくさん
  49. 49. リストフォームとは • (コマンド arg1 arg2 arg3 ……) • 関数呼出フォーム • 特殊フォーム • マクロフォーム Lisp として有効 25種類 たくさん たくさん
  50. 50. typepを使ってatomであること を確認してみよう • (typep 調べたい対象 型を表すSymbol名)
  51. 51. • (typep nil 'atom) • (typep 'nil 'atom) • (typep () 'atom) • (typep '() 'atom)
  52. 52. 復習
  53. 53. リストとは
  54. 54. リストとは • (括弧で囲まれたもの) • S式の一つ •
  55. 55. リストとは • (括弧で囲まれたもの) • S式の一つ • コンスセルの集まり
  56. 56. 今日覚える用語 • リスト • アトム • S式 • コンスセル • ドット対 • シンボル これ
  57. 57. コンスセルとは • リストの部品 • Lispにおける基本的なデータ構造
  58. 58. cons cell car cdr car cdr car cdr 1 32
  59. 59. cons cell car cdr car cdr car cdr コンスセルの要素は2つ
  60. 60. cons cell car cdr car cdr car cdr コンスセルの要素は2つ cdrで次のコンスセルを示す
  61. 61. cons cell car cdr car cdr car cdr コンスセルの要素は2つ cdrで次のコンスセルを示す NIL 終端がNILなら、プロパーリスト
  62. 62. car cdrって何?
  63. 63. 元はレジスタ名 • CAR (Content of Address part of Register) • CDR (Content of Decrement part of Register)
  64. 64. '(1 2 3 4 5 6 7) cdrcar 今は関数名
  65. 65. (car '(1 2 3 4 5 6 7))
  66. 66. (car '(1 2 3 4 5 6 7)) ;=>1
  67. 67. (cdr '(1 2 3 4 5 6 7))
  68. 68. (cdr '(1 2 3 4 5 6 7)) ;=>(2 3 4 5 6 7)
  69. 69. '(1 2 3) 1 2 3 NIL
  70. 70. '(1 2 3) 1 2 3 NIL 終端はNIL
  71. 71. '("foo" (1 2) 10) 10 NIL 2 NIL "foo" 1
  72. 72. consでリストを作ってみよう • (cons 1 (cons 2 ())) • (cons 'list (cons 1 (cons 2 nil))) • (cons 1 2)
  73. 73. (cons 1 (cons 2 ()))
  74. 74. (cons 1 (cons 2 ())) ;=>(1 2)
  75. 75. (cons 'list (cons 1 (cons 2 nil)))
  76. 76. (cons 'list (cons 1 (cons 2 nil))) ;=>(LIST 1 2)
  77. 77. (cons 1 2)
  78. 78. (cons 1 2) ;=>(1 . 2)
  79. 79. この「.」って何?
  80. 80. ドット対の「.」
  81. 81. (1 . 2) 1 2
  82. 82. ドット対とは • 終端がNILでも、他のコンスセルでもないときに 「.」が付く • car cdrだけでそのまま値を取得できるので便利 •
  83. 83. ドット対とは • 終端がNILでも、他のコンスセルでもないときに 「.」が付く • car cdrだけでそのまま値を取得できるので便利 • ドットリストはあまり使われない (1 2 . 3)とか
  84. 84. ドット対とリストの違いは? • 殆ど同じ(一部例外あり) • ドット対 ∈ リスト
  85. 85. 同じ例 '(1 . (2 . (3 . ())))
  86. 86. 同じ例 '(1 . (2 . (3 . ()))) ;=>(1 2 3)
  87. 87. 違う例 (cdr '(1 . 2)) (cdr '(1 2))
  88. 88. 違う例 (cdr '(1 . 2)) ;=>2 (cdr '(1 2)) ;=>(2)
  89. 89. c*r関数 • car cdr の長いやつ • *の数は1~4個 • *にはaかdが入る • 評価は右->左の順番
  90. 90. c*r関数 • car cdr の長いやつ • *の数は1~4個 • *にはaかdが入る • 評価は右->左の順番 リストが 内->外
  91. 91. (cadr '(1 2 3 4))
  92. 92. (cadr '(1 2 3 4)) ;=>2
  93. 93. (cadr x) ≡ (car (cdr x))
  94. 94. (cdr '(1 2 3 4)
  95. 95. (cdr '(1 2 3 4) ;=>(2 3 4)
  96. 96. (cdr '(1 2 3 4) ;=>(2 3 4) (car '(2 3 4))
  97. 97. (cdr '(1 2 3 4) ;=>(2 3 4) (car '(2 3 4)) ;=>2
  98. 98. (cdr '(1 2 3 4) ;=>(2 3 4) (car '(2 3 4)) ;=>2 ∴(cadr '(1 2 3 4)) ;=>2
  99. 99. c*rで遊ぼう • (cddr '((1 2 3) (4 5 6) 7)) • (caaddr '(1 (2 3) (4 5 (6 7)))) • (cdadr '((a . 1) (b . 2)))
  100. 100. (cddr '((1 2 3) (4 5 6) 7))
  101. 101. (cddr '((1 2 3) (4 5 6) 7)) d
  102. 102. (cddr '((1 2 3) (4 5 6) 7)) d d
  103. 103. (cddr '((1 2 3) (4 5 6) 7)) ;=>(7) d d
  104. 104. (cddr '((1 2 3) (4 5 6) 7)) ;=>(7) d d プロパーリストだと ネスト数は不変
  105. 105. (caaddr '(1 (2 3) (4 5 (6 7))))
  106. 106. (caaddr '(1 (2 3) (4 5 (6 7)))) d
  107. 107. (caaddr '(1 (2 3) (4 5 (6 7)))) d d ((4 5 (6 7)))
  108. 108. (caaddr '(1 (2 3) (4 5 (6 7)))) d d ((4 5 (6 7))) (4 5 (6 7)) a
  109. 109. (caaddr '(1 (2 3) (4 5 (6 7)))) d a ((4 5 (6 7))) (4 5 (6 7)) a d
  110. 110. (caaddr '(1 (2 3) (4 5 (6 7)))) ;=>4 d a ((4 5 (6 7))) (4 5 (6 7)) a d
  111. 111. (cdadr '((a . 1) (b . 2)))
  112. 112. (cdadr '((a . 1) (b . 2))) ad (b . 2)
  113. 113. (cdadr '((a . 1) (b . 2))) ad d (b . 2)
  114. 114. (cdadr '((a . 1) (b . 2))) ;=>2 ad d ドット対だと ネスト数は-1 (b . 2)
  115. 115. リストを ルックアップテーブルとして 使ってみよう
  116. 116. 連想リスト • association list (alist) • keyとvalueが一対一に対応 • eqlでTを返した一つ目の要素を返す
  117. 117. (assoc 'a '((a 1) (b 2) (c 3)))
  118. 118. (assoc 'a '((a 1) (b 2) (c 3))) ;=>(A 1)
  119. 119. (assoc 'a '((a 1) (b 2) (a 3)))
  120. 120. (assoc 'a '((a 1) (b 2) (a 3))) ;=>(A 1)
  121. 121. (assoc 'a '((a 1) (b 2) (a 3))) ;=>(A 1) 0番目の要素から走査して、 1番最初にTを返した要素を1つ返す
  122. 122. どうやって使うの?
  123. 123. ※一部不適切な改行があります
  124. 124. 日本 東京 北海道 大阪 新幹線 飛行機
  125. 125. (現在地 (目的地 方向 手段))
  126. 126. ダイナミック変数には *耳あて*当てを付ける ダイナミック変数定義 defparameter
  127. 127. alist ダイナミック変数には *耳あて*当てを付ける ダイナミック変数定義 defparameter
  128. 128. (assoc 'tokyo *edges*)
  129. 129. (assoc 'tokyo *edges*) ;=>(TOKYO (HOKKAIDO NORTH AIRPLANE) (OSAKA WEST SHINKANSEN))
  130. 130. (assoc 'osaka *edges*)
  131. 131. ;=>(OSAKA (TOKYO EAST SHINKANSEN)) (assoc 'osaka *edges*)
  132. 132. 関数定義 defun 引数 location
  133. 133. レキシカル変数の定義 let レキシカル変数 info
  134. 134. dolistとは • リストに対する繰り返し • 他にdoやdotimesがある
  135. 135. (dolist (x '(1 2 3 4)) (print x))
  136. 136. (dolist (x '(1 2 3 4)) (print x)) ;=> 1 2 3 4
  137. 137. (dolist (x '(1 2 3 4)) (print x)) ;=> 1 2 3 4 要素一つ一つに対して改行を入れる
  138. 138. このバッククオートって何? このカンマって何?
  139. 139. バッククオート • シングルクオートと同じくコードモード • カンマを入れると、そこだけ評価される
  140. 140. `(hello ,(cadddr '(all over the world)) !) 関数呼出フォームの例
  141. 141. `(hello ,(cadddr '(all over the world)) !) ;=>(HELLO WORLD !) 関数呼出フォームの例
  142. 142. 変数の例 (setf item '(three apples)) `(i have ,@item)
  143. 143. 変数の例 (setf item '(three apples)) `(i have ,@item) 変数定義 setf 括弧を外す
  144. 144. 変数の例 (setf item '(three apples)) `(i have ,@item) ;=>(I HAVE THREE APPLES) 変数定義 setf 括弧を外す
  145. 145. ※一部不適切な改行があります
  146. 146. 全ての文法解説終わり
  147. 147. 改行を直して実行しよう
  148. 148. loadして実行もできる
  149. 149. (load "alist")
  150. 150. 改行やインデントは 勝手に入れていいの?
  151. 151. Lispで意味を持たないもの • 改行 • 空白 • インデント
  152. 152. 閉じ括弧を改行せずに 同一行に入れるのは 慣習
  153. 153. 残る一つは
  154. 154. シンボル
  155. 155. 今日覚える用語 • リスト • アトム • S式 • コンスセル • ドット対 • シンボル これ
  156. 156. 小文字で書いたコードが 大文字で返ってきたことが ありましたよね?
  157. 157. (cons 'list (cons 1 (cons 2 nil))) ;=>(LIST 1 2)
  158. 158. (assoc 'a '((a 1) (b 2) (c 3))) ;=>(A 1)
  159. 159. `(hello ,(cadddr '(all over the world)) !) ;=>(HELLO WORLD !) 関数呼出フォームの例
  160. 160. 変数の例 (setf location 'tokyo) `(i live in ,location) ;=>(I LIVE IN TOKYO)
  161. 161. 今、大文字に変換されたのが 全部シンボル
  162. 162. シンボルとは • 名前を管理するオブジェクト • Lispでは高頻度で使用 • 関数名も変数名も全部シンボル
  163. 163. 他言語だと 「文字列の皮を被った数字」 と説明がされてるけど、 Lispだとどうやって同一性を保ってるの?
  164. 164. パッケージ管理で 同一性を保証してる
  165. 165. パッケージとは • シンボルのルックアップテーブル • 同一の文字列(シンボル名)から同一のシンボルオ ブジェクトを取得する • ライブラリやAPIを使用するときにシンボル名が バッティングするのを防ぐ
  166. 166. (list-all-packages)
  167. 167. • #<PACKAGE GSTREAM> • #<PACKAGE GRAY> • #<PACKAGE I18N> • #<PACKAGE SOCKET> • #<PACKAGE SCREEN> • #<PACKAGE CUSTOM> • #<PACKAGE EXT> • #<PACKAGE CLOS> • #<PACKAGE CS-COMMON-LISP-USER> • #<PACKAGE CS-COMMON-LISP> • #<PACKAGE CHARSET> • #<PACKAGE KEYWORD> • #<PACKAGE SYSTEM> • #<PACKAGE COMMON-LISP-USER> • #<PACKAGE COMMON-LISP> • #<PACKAGE EXPORTING> • #<PACKAGE POSIX> • #<PACKAGE REGEXP>
  168. 168. • #<PACKAGE GSTREAM> • #<PACKAGE GRAY> • #<PACKAGE I18N> • #<PACKAGE SOCKET> • #<PACKAGE SCREEN> • #<PACKAGE CUSTOM> • #<PACKAGE EXT> • #<PACKAGE CLOS> • #<PACKAGE CS-COMMON-LISP-USER> • #<PACKAGE CS-COMMON-LISP> • #<PACKAGE CHARSET> • #<PACKAGE KEYWORD> • #<PACKAGE SYSTEM> • #<PACKAGE COMMON-LISP-USER> • #<PACKAGE COMMON-LISP> • #<PACKAGE EXPORTING> • #<PACKAGE POSIX> • #<PACKAGE REGEXP> デフォルトのパッケージ だけでこんなに
  169. 169. 最初に3つだけ覚えよう
  170. 170. 3つの標準パッケージ • COMMON-LISP • COMMON-LISP-USER • KEYWORD
  171. 171. COMMON-LISP • 言語標準の全シンボルをエクスポート • 追加でインターンできない • ニックネーム CL
  172. 172. COMMON-LISP-USER • デフォルトのカレントパッケージ • 追加でインターンできる • 雑記用として使用 • ニックネーム CL-USER
  173. 173. CL-USERはCLを継承している CL CL-USER :use CLの外部シンボルをCL-USERから参照できる inherit
  174. 174. KEYWORD • 「:」の付いたシンボルを管理 • シンボル名に:はつかない
  175. 175. 用語解説
  176. 176. インターン • シンボルをパッケージに登録すること • 'helloと書くだけでインターンされる
  177. 177. エクスポート • 内部シンボルを他のパッケージからも参照可能 な状態にすること • エクスポートされたシンボルは外部シンボルと 言われ、継承したシンボルから参照できる
  178. 178. 内部シンボル • カレントパッケージからしか参照できないシン ボル • find-symbolで:INTERNALが返ってくる
  179. 179. 外部シンボル • 継承したパッケージからも参照できるシンボル • find-symbolで:EXTERNALが返ってくる
  180. 180. 継承 • 他のパッケージを:useして、外部シンボルを参照 可能な状態にすること • find-symbolで:INHERITEDが返ってくる
  181. 181. シンボルを継承する手順 • シンボルをインターン • エクスポートして、外部シンボルにする • 他のパッケージから:useする
  182. 182. カレントパッケージの確認 *package*
  183. 183. カレントパッケージの確認 *package* ;=>#<PACKAGE COMMON-LISP-USER>
  184. 184. カレントパッケージの確認 *package* ;=>#<PACKAGE COMMON-LISP-USER> デフォルトの カレントパッケージ COMMON-LISP-USER
  185. 185. シンボルとパッケージで遊ぼう • find-symbol • intern • symbol-name • defpackage
  186. 186. find-symbol • 参照可能な範囲にシンボルが存在するか • シンボルの状態が内部、外部、継承のどれか • (find-symbol "シンボル名" 'パッケージ名)
  187. 187. find-symbol • 参照可能な範囲にシンボルが存在するか • シンボルの状態が内部、外部、継承のどれか • (find-symbol "シンボル名" 'パッケージ名) 省略可
  188. 188. シンボルの公開・継承 • カレントパッケージのみで参照可能 :INTERNAL • useしたパッケージからも参照可能 :EXTERNAL • 外部シンボルを:useしてる :INHERITED
  189. 189. clispを立ち上げた直後に (find-symbol "CAR")
  190. 190. clispを立ち上げた直後に (find-symbol "CAR") ;=>CAR ; :INHERITED
  191. 191. clispを立ち上げた直後に (find-symbol "CAR") ;=>CAR ; :INHERITED 参照可能 他のパッケージから 継承してる
  192. 192. clispを立ち上げた直後に (find-symbol "CAR" 'cl)
  193. 193. clispを立ち上げた直後に (find-symbol "CAR" 'cl) ;=>CAR ; :EXTERNAL
  194. 194. clispを立ち上げた直後に (find-symbol "CAR" 'cl) ;=>CAR ; :EXTERNAL 参照可能 外部シンボルとして 公開してる
  195. 195. intern • パッケージにシンボルをインターン • (intern "シンボル名" "パッケージ名")
  196. 196. (find-symbol "FOO") ;=>NIL; NIL FOOがインターンされてない
  197. 197. (intern "FOO") ;=>FOO NIL FOOがインターンされてる (find-symbol "FOO")
  198. 198. (intern "FOO") ;=>FOO NIL FOOがインターンされてる (find-symbol "FOO") ;=>FOO :INTERNAL 参照可能 内部シンボル
  199. 199. find-symbolやinternに Stringでシンボル名を渡すのは 何故?
  200. 200. シンボル名は 大文字小文字を区別するから
  201. 201. readerが変換してるだけ 'foo "FOO" パッケージ read intern "FOO"
  202. 202. intern関数は変換しない 'foo "foo" パッケージ intern "foo"
  203. 203. (find-symbol "car" 'cl)
  204. 204. (find-symbol "car" 'cl) ;=>NIL; NIL
  205. 205. (find-symbol "car" 'cl) ;=>NIL; NIL 大文字小文字を区別
  206. 206. シンボルを直書きするときに 大文字小文字を区別したい
  207. 207. '|Foo| パイプで囲む
  208. 208. '|baR| (find-symbol "baR") clispを立ち上げた直後に
  209. 209. '|baR| (find-symbol "baR") ;=>|baR| ; :INTERNAL clispを立ち上げた直後に
  210. 210. '|baR| (find-symbol "baR") ;=>|baR| ; :INTERNAL clispを立ち上げた直後に シンボル名にパイプは入らない
  211. 211. '|baR| (find-symbol "baR") ;=>|baR| ; :INTERNAL clispを立ち上げた直後に シンボル名にパイプは入らない 返り値には入る
  212. 212. シンボルで使われる ' : | はシンボル名に入るの、入らないの?
  213. 213. symbol-nameで確認
  214. 214. symbol-name関数 • (symbol-name 'シンボル)
  215. 215. (symbol-name 'hello)
  216. 216. (symbol-name 'hello) ;=>"HELLO"
  217. 217. (symbol-name '|baR|)
  218. 218. (symbol-name '|baR|) ;=>"baR"
  219. 219. (symbol-name :world)
  220. 220. (symbol-name :world) ;=>"WORLD"
  221. 221. パッケージを 定義してみよう
  222. 222. defpackageで出来ること • パッケージを作る • 他のパッケージを継承する • シンボルをエクスポートする • シンボルをシャドーイングリストに入れる • 他のパッケージの外部シンボルをインポートする etc
  223. 223. defpackage defined-package-name [[option]] option::= (:nicknames nickname*)* | (:documentation string) | (:use package-name*)* | (:shadow {symbol-name}*)* | (:shadowing-import-from package-name {symbol-name}*)* | (:import-from package-name {symbol-name}*)* | (:export {symbol-name}*)* | (:intern {symbol-name}*)* | (:size integer) オプション一覧
  224. 224. 今日は :useと:exportだけ
  225. 225. (defpackage foo (:use :common-lisp)) 継承する(:use)
  226. 226. (defpackage foo (:use :common-lisp) (:export hello)) 外部シンボルにする(:export)
  227. 227. 使ってみる
  228. 228. (defpackage foo (:use :cl)) (defpackage bar (:use :cl :foo)) BARはFOOを継承
  229. 229. (defpackage foo (:use :cl)) (defpackage bar (:use :cl :foo)) (in-package "FOO") 'hello FOOでHELLOをインターン
  230. 230. (defpackage foo (:use :cl)) (defpackage bar (:use :cl :foo)) (in-package "FOO") 'hello (in-package "BAR") (find-symbol "HELLO") BARで HELLOを参照しようとする
  231. 231. (defpackage foo (:use :cl)) (defpackage bar (:use :cl :foo)) (in-package "FOO") 'hello (in-package "BAR") (find-symbol "HELLO") 返り値は?
  232. 232. ;=>NIL; NIL
  233. 233. 何故か
  234. 234. BARはFOOを継承してる FOO BAR :use
  235. 235. しかし、HELLOは 内部シンボル FOO BAR :use HELLO BARから見えない
  236. 236. clisp再起動
  237. 237. (defpackage foo (:use :cl) (:export hello)) FOO::HELLOを 外部シンボルに
  238. 238. (defpackage foo (:use :cl) (:export hello)) FOO::HELLOを インターン (intern "HELLO" "FOO")
  239. 239. (defpackage foo (:use :cl) (:export hello)) BARはFOOを継承 (intern "HELLO" "FOO") (defpackage bar (:use :cl :foo))
  240. 240. (find-symbol "HELLO" "BAR") 返り値は?
  241. 241. ;=>FOO:HELLO ; :INHERITED (find-symbol "HELLO" "BAR") ちゃんと継承してる 返り値は?
  242. 242. (find-symbol "HELLO" 'foo) 'fooにすると
  243. 243. ;=>FOO:HELLO ; :EXTERNAL (find-symbol "HELLO" 'foo) ちゃんと外部シンボルに 'fooにすると
  244. 244. 「:」の使い所 • キーワードシンボル (:junk-allowed) • パッケージ修飾子 (cl::car) • アンインターンドシンボル ('#:foo)
  245. 245. foo:hello • FOOの外部シンボルHELLOを呼ぶ • カレントパッケージでもシンボルが:INTERNAL なら呼び出せない
  246. 246. foo::car • :INTERNALでも:EXTERNALでも関係なく呼び出 す • カレントパッケージの外側でも参照可能 • パッケージ作成者がプライベートにしたいシン ボルまで呼び出せるため、推奨されない
  247. 247. '#:foo • アンインターンドシンボル • パッケージにインターンされない
  248. 248. (eq 'cl:car 'cl::car) (eq 'car 'cl:car)
  249. 249. (eq 'cl:car 'cl::car) ;=>T (eq 'car 'cl:car) ;=>T
  250. 250. (eq '#:foo '#:foo)
  251. 251. (eq '#:foo '#:foo) ;=>NIL
  252. 252. シンボルの説明終わり
  253. 253. 最後に
  254. 254. Common Lispの情報源
  255. 255. Land of Lisp • 作りながら覚える • 文法解説が少ない • CAR CDRから入る正統派 Lisper養成本
  256. 256. 実践Common Lisp • 文法解説が詳しい • 辞書としても使える • Lisperとしては不純
  257. 257. Common Lisp HyperSpec • 英語 • 網羅性が高い
  258. 258. 以上
  259. 259. 質問タイム

×