スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Prev.    Category    Next 

式の構文と評価法 - 環境設定のための Emacs Lisp 入門

elisp 入門の最初として 今回は Emacs lisp の式の構文と Emacs での式の評価法を説明します。

Hello World !

『 K&R 』以来、プログラミングの入門では Hello World で始めるのが慣例です。 ここでも Hello World で始めましょう。

まず、 Emacs を起動した時に表示される*scratch*バッファーに 以下のように記述して下さい。
(message "Hello World!")
elisp_guide_hello.png

次に行の最後で C-j を押してみましょう。 ミニバッファーに "Hello World!" の文字が表示されるはずです。

これから、この仕組みについて少しづつ解説してみたいと思います。

式の構文

最初に elisp で使われる式の構文について説明します。

式と評価

Lisp ではは以下の形式で、一般的なプログラムの関数とは少し書き方が違っています。
(関数 値 ...)
(例) 使用言語の設定
(set-language-environment "Japanese")
elisp_guide_expr.png

最初の Hello World 例も message がミニバッファーに文字列を表示する「関数」で、 "Hello World!"が「値」です。
式を実行することを Lisp では 評価する(eval)と言います。 *scratch* バッファーでは C-j を押すことによって直前の括弧の式が評価されます。 起動時には init.el などに書いた式が順に評価されていくことになります。

また、*scratch* バッファーにも "Hello World!" と出たと思いますが、 こちらは式を評価した戻り値です。


なお、関数の後の値は引数といい、 関数によってとる種類や数が違います。 引数を取らない関数もあります。
;;; ステータスラインに時間を表示する
(display-time)

演算子

Lisp では +, * などの演算子も関数として同じ形式で記述します。

(例) 四則演算
(* 5 3)       ; 15 
(* 5 3 2)     ; 5 * 3 * 2 = 30
(* 2 (+ 1 3)) ; 2 * (1 + 3) = 8
こういった演算子を前に記述する書き方を ポーランド記法や前置法と呼びます。これに対して一般的なプログラミング言語の書き方は中置法と呼ばれています。
[中値法]   1 + 1
[前置法]  (+ 1 1)
この前置法はとっつきにくかったり、括弧が多くなって見づらくなったりする原因ともなります。
しかし、この記法は式、データなどを統一的に書くことができ、 慣れてくると "美しい" と感じられる書き方でもあります。 おそらく、この設定に絞った入門だと Lisp の美しさまでお伝えできないのではないかと思います。 そこは非常に残念ですが、とりあえずはこういう書き方だと思って我慢して書いていって下さい。

コードの評価(eval)方法

最初の *scratch* バッファーを使った例のように Emacs では書いた elisp の式の評価を試してみる方法が色々と用意されています。 ここでは設定に役に立つ方法を 2 つ紹介します。
  1. C-x C-e
  2. ファイルのロード

C-x C-e(eval-last-sexp)

C-x C-e(eval-last-sexp) コマンドはカーソルの直前の式を評価し、 結果をミニバッファに表示します。
(* 2 (+ 1 3))
           ^ 1 + 3 → 4
            ^ 2 * 4 → 8

ファイルのロード

Emacs では load-file という elisp ファイルをロード(読み込んで、評価)する コマンドがあります。
ただ、それだとちょっと指定が面倒なので、 カレントバッファーのファイルをロードする関数を作成しました。 次のコードを init.el に記述すると [F7] キーでファイルがロードされるようになります。
(defun my-load-current-buffer-file ()
  "Load current buffer file"
  (interactive)
  (basic-save-buffer)
  (load (buffer-file-name)))

(add-hook 'emacs-lisp-mode-hook
          '(lambda ()
             (local-set-key [f7] 'my-load-current-buffer-file)))
この入門では拡張用に関数を作るところまでは踏み込みませんが、 キーの設定に関しては後で解説をしています。

elisp 編集に便利な機能

式の評価以外で elisp 編集によく使う機能も紹介しておきます。

ヘルプ

設定時のヘルプとして覚えておいた方がよいコマンドは以下の 3 つでしょう。
キー 説明
C-h k キーに割り当てられたコマンドの表示
C-h f 関数の説明
C-h v 変数の説明

式、変数の補完

Emacs では式や変数の名前は途中で補完することができます。
書いている途中で [M-TAB] を押してみて下さい。 補完候補が表示されると思います。
(mess[M-TAB]  →  (message
また、 パッケージを使えば、 Visual Studio のように GUI で候補を表示することもできます。 こちらを使いたい場合は以前の記事を参考にしてください。

Emacs を関数電卓に!

Lisp の構文はちょっと慣れが必要です。 そこでお薦めしたいのが Emacs を関数電卓代わりに使うことです。

*scratch* バッファーで評価する方法を使えば、 四則演算などの式を書いて計算させることができます。
また、理系の人は知っていると思いますが、 関数電卓は通常の電卓の機能に加えて sin, log, expt(乗数)などの数学的な関数も使えるようになっています。 elisp にもそういった数学関数が用意されています。
elisp_guide_calc.png


その他にも、プログラミングをしていると 2 進数、 16 進数などの変換をしたいことが あると思います。
elisp では #b, #o, #x を使ってそれぞれ 2, 8, 16 進数の数を表現することができ、 それを評価すると 10 進数の値が表示されます。
#b110
6

#o666
438

#xFF
255
逆の変換は format 関数を使います。 ただし、 2 進数は用意されていません。
(format "%o" 9)
"11"
(format "%x" 15)
"f"
(format "%X" 15)
"F"


関連記事
スポンサーサイト
Prev.    Category    Next 

Facebook コメント


コメント

No title

scratchのtが足りません。

Re: No title

> scratchのtが足りません。

ご指摘ありがとうございます。
記事の方を修正しました。

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
9位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
3位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

09月 | 2017年10月 | 11月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。