My開発メモ

最近の投稿

mysqlの中の一部分のデータをダンプしたい

mydb の中の mytable から id が1以上のデータをダンプしたい。

> mysql -t -uroot -p mydb mytable -w"id>0" > mytable.dump

参考

カテゴリ: MySQL
タグ: mysqldump
Count: 2

CLISP開発環境の構築(Ubuntu)

Land of Lispを読んでいるので、開発環境をつくることにする。

Lispなので、Emacsを使うのがいいだろう。

インストール

slime-modeのインストール

M-x list-package にて、slime-modeをインストールする。

これで自動的に path の通ったところ(elispディレクトリ)にインストールさ れる。

.init.elへの記述は、以下のページを参考にした。

(参考) モダンComMon May 18 10:48:43 2020礎編

~/.emacs.d/init.el

(setq inferior-lisp-program "clisp")
(require 'slime)
(slime-setup '(slime-repl slime-fancy slime-banner))

これで、M-x slimeとすると、slime-mode になる。

ac-slimeのインストール

コマンド文字列補完機能を提供する ac-slime をインストールする。

M-x list-package でインストールする。

0.50.8 があったので、0.8 をインストールした。

init.el への記述は、インストール時の説明にあったのをコピーした。

~/.emacs.d/init.el

(require 'ac-slime)
(add-hook 'slime-mode-hook 'set-up-slime-ac)
(add-hook 'slime-repl-mode-hook 'set-up-slime-ac)
(eval-after-load "auto-complete"
  '(add-to-list 'ac-modes 'slime-repl-mode))

ac-slimeには、auto-completeが必要とあったが、僕はもうすでにイ ンストールしてあった。

使う

M-x slime とすると、ウィンドウが分割されて、ひとつが Lispのコードを入力するウィンドウで、もう一つが clisp のコマンドを入力して動作を確認できる REPLウィンドウとなる。

コードを入力したあと、そのウィンドウで以下のショートカットを実行する。

C-c C-c
トップレベルの関数をコンパイルする
C-c C-k
そのウィンドウすべてをコンパイルする

CLisp Replの使い方

ターミナルで、> clisp とすると、clisp repl が起動する。

[1]> (load "log.lisp")

とすることで、lispファイルを読み込むことができる。

[2]> (quit)

で、Repleから抜けられる。


カテゴリ: Emacs Clisp Ubuntu
タグ: Emacs Clisp
Count: 6

Common Lisp メモ

Land of Lisp に出てくる関数などについてのメモ。

defparameter グローバル変数を定義する。(再定義可能)

同じ変数名で再定義すると値が変わる。

> (defparameter *foo* 5)
*FOO*
> *foo*
5
> (defparameter *foo* 6)
*FOO*
> *foo*
6
defvar グローバル変数を定義する。(再定義不可)

初期値が nil だった場合に限り、再定義できる。

> (defvar *foo* 5)
*FOO*
> *foo*
5
> (defvar *foo* 6)
*FOO*
> *foo*
5
defun グローバル関数を定義する。
(defun function_name (arguments)
  ...)
setf 場所に値を代入する
> (setf x '(1 2 3 4))
(1 2 3 4)
> x
(1 2 3 4)
> (setf (car x) 9)
9
> x
(9 2 3 4)

ローカル変数は let を使うだろうから、ここでは グローバル変数を意識しているのかな。

場所 としたのは、単にシンボルだけではないからである。これは、次の setq と比較するとわかる。

setq シンボルに値を代入する

setf も setq も同様の働きをするのだが、違いはどうなんだろう?

> (setq x '(1 2 3 4))
(1 2 3 4)
> (setq (car x) 8)
*** - SETQ: (CAR X) is not a symbol

setq は、シンボルへの代入でないと怒られる。

Lisp/始めの一歩/経験者用チュートリアル/代入 によると、setfのほうが強力だということである。

SETFってなに?

let ローカル変数を定義する

(let (変数定義のリスト) ......)

> (let ((a 5) (b 6))
     (+ a b))
11
flet ローカル関数を定義する

(let (関数定義のリスト) ......)

> (flet ((f (n) (+ n 10))
         (g (n) (- n 3)))
     (g (f 5)))
12
eq シンボルを比較する
> (eq 'apple 'apple)
T
> (eq "apple" "apple")
NIL
> (eq 3 3)
T
> (eq 3.0 3.0)
NIL
assoc リストの中からキーをもとにほしい要素を抜き出す。
例)(assoc 'garden *nodes*) *nodes*リストの中から、garden を抜き出す。
(GARDEN (YOU ARE IN A BEAUTIFUL GARDEN, THERE IS A WELL IN FRONT OF YOU.))
準クォート(`)
`(there is a ,(caddr edge) going ,(cadr edge) from here.)

準クォート(`)でデータモードに入る。 カンマ(,)の後の()は、edge のリストを表示している。

(`)はバッククォート。

mapcar 引数に他の関数とリストを受け取って、リストの要素一つ一つについてそれを引数として受け取った関数を呼び出す。
例)(mapcar #'sqrt '(1 2 3 4 5))
(1 1.4142135 1.7320508 2 2.236068)
例)(mapcar #'car '((foo bar)(baz qux)))
(foo baz)

CommonLisp では、変数の名前空間と関数の名前空間があり、変数と関数で同じ名前を使ってもかまわない。 しかし、Scheme はだめ。

append いくつかのリストをつなげて一つのリストにする。
例)(append '(mary had) '(a) '(little lamb))
(MARY HAD A LITTLE LAMB)

くっつけたいリストを1つずつ別々の引数として渡す必要がある。

例では、それぞれシングルクォートで別々のリストとしている。

これを1つのリストとして渡すには apply を使う。

apply リストの各要素をそれぞれ別の引数として関数にわたす。
例)(apply #'append '((mary had)(a)(little lamb)))
(MARY HAD A LITTLE LAMB)
princ 人間が読みやすいように出力する。
read-line enterキーが押されるまで入力を受け付ける。
(defun say-hello ()
           (princ "Please type your name:")
           (let ((name (read-line)))
             (princ "Nice to meet you,")
             (princ name)))
eval 変数に格納されているコードを実行する。
CL-USER> (defparameter *foo* '(+ 1 2))
*FOO*
CL-USER> (eval *foo*)
3

(注)マクロをつかえばすむところに eval を使ってはいけない。 セキュリティ上の危険を招く可能性がある。

prin1-to-string シンボルのリストを文字列に変換する。1行で表示。
coerce 文字列を文字のリストにする。
char-upcase 現在の文字を大文字にする。
カテゴリ: Lisp
タグ: Common Lisp Land of Lisp
Count: 46