factorial - みる会図書館


検索対象: UNIX MAGAZINE 1990年9月号
5件見つかりました。

1. UNIX MAGAZINE 1990年9月号

emacs 入門 (C) -- A11 ーー [JJJ—] - ーい n ( 信 cto ⅱ引 ( - n l))))) ( ⅱ (: n 0 ) (defun factorial (n) (print factorial(n))) Wefun print-factorial (n) 図ロ分害揃の画面 : factorial . el (ünacs—Lisp) ーー A11 ー [JJJ—] 図円ウインドウごとに異なるファイルを表示 5 printf("XdYn• . factorial(n)) : n : atoi(argv[ll); int n; Char *targv,• int argc; min(argc. a【駆) include tdio. ト ー ( 第 n (factorial ( - n l))))) (i f ( : n 0 ) ()e fun fac to ri (n) (print factorial (n))) (defun print-factorial (n) ] : main. c -NEmacs : factorial . el (Enacs—Lisp)—A11——[JJJ-]— 図田水平分割した画面 wefun print-factorial (n) (print factorial(n))) (defun factorial (n) Ⅲ ( : n 0 ) ーい n (factorial ( - れ I))))) -- ] ———--Nhnacs : factorial . el (defun print-factorial (n) (print factorial(n))) (defun factorial (n) ( ⅱ (: n の ー ( 第れ (factorial ( - n —NEnacs : factorial . el return n•factorial(n-l); return l,• if (n int n; 信 ct0 ⅱ引 (n) printf("XdYn", 信 cto ⅱ引 (n)) : n : atoi(argv[ll); lnt n; Char int argc; min(argc, a 宿の 印 n 日 u tdio. 図 20 垂直分割した画面 main. C C-x 5 C-x 2 (ünacs-Lisp)--A11--(JJ 」 -]- (ünacs—Lisp)——A11—-[JJJ—]— ーい n (factorial ( - れ l))))) ()f ( : n 0 ) l(defun factorial (n) (print factorial (n))) l(defun print-factorial (n) -Nemacs: factorial . el— ウインドウ ん、いわゆるウインドウ・システムのそれとは違います。 このそれぞれの画面を、、ウインドウ〃と呼びます。もちろ 利用すれば編集中の複数のファイルを同時に表示できます。 Nemacs には画面を分割する機能がありますが、これを て端末工ミュレータをもう 1 っ開きますか ? 2 つ並べますか ? それとも、ウインドウ・システムを使っ 編集したい場合にはどうすれはいいのでしようか。端末を たとえば、さきほどの main. c を見ながら factorial.el を ときには 2 つのファイルを見比べながら編集したい 128 2 つのファイルを見比べながら編集するには、 では、ファイルは 1 つしか表小されていません。 を実行した際の Nemacs の起動時の画面です。この状態 % nemacs malli. C factorial . el 図 17 を見てください。これは、 を実行してください。 C-x 2 は M-x split-window- vertically とおなし動作で、画面を上下 2 つに分割します ( 図 18 ) 。その後、 C-x b く CR 〉 を実行すると、表示されていなかったほうのファイルが表 M ー x . p ! 当は 9 当こ be ! 塰 9 可国ツく C R 〉 または、 C-x 5 画面を左右に分割することもできます。これは、 示されます ( 図 19 ) 。 UNIX MAGAZINE 1990.9

2. UNIX MAGAZINE 1990年9月号

emaCS 入門 図幻 C モードのインデント #include く st 0 > main(argc,argv) argc ; char * * 矼空 ; int Ⅱ ; Ⅱ = at 。土 ( 矼空 [ 1 ] ) ; printf ("%d\n" ,factorial(n) ) ; factorial(n) int Ⅱ ; if ( Ⅱ return 1 ; ()f ( = Ⅱ 0 ) (defun factorial (n) (print factorial (n) ) ) (defun print—factori 訌 ( Ⅱ ) 図 22 Lisp モードのインデント return n*factorial(n—l) ; else ←く TAB> を入力すると引数を 8 文字下げる ←く TAB> を入力すると関数中は 2 文字下げる ← if 文中はさらに 2 文字下げる 1 ( * n (factorial ( ーⅡ 1 ) ) ) ) ) ←く TAB 〉を入力すると 2 文字下げる ← ( の数に応じて字下げする を実行した後、 C-x b く CR 〉としてください ( 図 20 ) 。この とき、モードラインは各ウインドウの下に表示されていま す。 ウインドウを分割してファイルを並べてみると・・・・・・ちょ っと違いますね。ん、ファイルの内容が違うのは当り前し ゃないかですって ? いえいえ、ファイルの内容ではなくて モードラインの、、 ( ) 〃内の表示のことです。 main. c のほうでは、 (C) となっていますが、 factorial. el のはうでは、 (Emacs-Lisp) となっています。、、 ( ) 〃内の文字は、しつはバッフアのヾモ ード〃を示しているのです。バッフアに対しては、次の 2 種類のモードが指定できます。 UNIX MAGAZINE 1990.9 メジャーモード マイナーモード バッフアの表示の仕方や入力されたキーの解釈方法を決 定するのが、これらのモード ( とくにメジャーモード ) で す。 main. c のメジャーモードは、℃〃モードで、 factorial. el のはうは、、 Emacs-Lisp" モードです。 たとえは、 main. c の編集中に TAB キーを入力すると 適切な位置までインデント ( 字下げ ) をしてくれたことに 気づいたでしようか ( 図 (1)0 また、 factorial.el を編集し た場合にも、やはり TAB キーを入力することによって Lisp にあった適切なインデントを施してくれます ( 図 22 ) 。 このように、バッフアのメジャーモードに応してインデ ントの仕方を変えてくれるわけです。言い換えれば、 C mode は C 言語の形式を知っていて、 が入力されたら、次の行からはインデントを 1 段深くする とか、 129

3. UNIX MAGAZINE 1990年9月号

図ロ factorial.el (defun print—factorial ( ) Ⅱ = at 。土 ( 矼空 [ 1 ] ) ; int n; char **argv ; int argc ; main(argc , arg の #include く stdio. h> 図図 main. c 1 ( * れ (factorial ()f ( = n 0 ) (defun factorial ( Ⅱ ) (print factori 訌 ( Ⅱ ) ) ) るところへ $/program/KAIHATSU/main. c" を読み return n*factorial(n-l) ; else return 1 ; if ( Ⅱ 1nt n; factori 訌 (n) printf ("%d\n" ,factorial (n) ) ; emacs 入門 図丐 main. c を読み込んだときの画面 代加 rn ntfactorial(n-l); e ー se 代加 rn l; ⅱ (n int n; factorial(n) printf("XdYn-, factorial (n)); n : atoi(argv[l]); int n; Char *targv, int argc,• min(argc,argv) EincIude 納 tdi0. main. C printf("XdYn",factonaI(n)); n : atoi(argv[l]); int n; char まま a ー g マ : int argc; *. a宿マ) 5incIude «stdio. ト 図田 M-x list-buffers の実行 Size Åode mal.n . C File Aoæ/ara/Doc/Emcs/SÅÅPLES/min. c (C) ー A11 ー [JJJ-] ー 第日 List* 0 0 Lisp lnteraction Buffer Åenu *Buffer List* * Buffer List * (Buffer Menu)-—A11-—[-JJ-] 込むと、 となります。 ファイル名 /document/UNIMAGA/main. c /program/KAIHATSU/main. c ノヾッファ名 rnaln . C ma ⅲ . c く 2 〉 こまで、、バッフアとはファイルを保存しておくための 領域〃として話を進めてきましたが、実際にはファイル以 外のものも保存されます。たとえは、ファイルを指定せす に Nemacs を起動したときに最初に画面に現れる領域は、 * s cratch * という名前のバッフアです。このバッフアは、新しいファ イルを作るときやメモ書きなどに利用できます。また、 M-x list-buffers く CR 〉 を実行すると、現在 Nemacs 上にあるすべてのバッファ を表示しますが ( 図 16 ) 、この表示をおこなう領域自体が、 UNIX MAGAZINE 1990.9 という名則のバッフアになっています。 このように特殊な表小をおこなうための領域もバッファ として扱われ、画面上に表示されなくなった後も Nemacs のなかに残っているので、必要ならはふたたび表示するこ とができます。 ところで、バッフアのうちで変わり者が 1 人います。 ニバッファ (mini-buffer)" と呼ばれているバッフアで、 M-x で関数名を指定する場合や、ファイルを読み込むコマ ンド C-x C-f の引数 ( ファイル名 ) を入力するときに使わ れます。このバッフアはエコー領域にいて、コマンドやそ の引数を入力する役割を扣っています。 M-x list-buffers でも表小されないおとなしいバッフアですが、いちおうバ ッフアの仲間だと覚えておいてください。 ニバッフアについては、いすれ詳しくお話しすること があるでしよう。 127

4. UNIX MAGAZINE 1990年9月号

emacs 入門 図 23 Overwrite と Aut0 Fill モードを指定した画面 (C 0 、 rt F 土 11 ) ー - A11-- [JJJ] -- 代加 rn n•factorial(n-l); 加 rn l; factorial(n) printf("XdYn• . 信 ctori 引 (n)); n : atoi(argv[l]); int n; int argc; min(argc. argv) include ” tdio. ト : main. C ラベ丿レ : の形があったら C 言語のラベルが入力されたと思って、イ がきたらインデントを 1 段浅くします。 がきたらインデントを 1 段深くして、 Lisp モードでも同様で、 ンデントを半分前に出すといった処理をしてくれます。 挙げられます。通常、 Nemacs では文字を入力するとカー ードです。分かりやすい例としては、 Overwrite モードが マイナーモードは、もうすこし細かい動作を決定するモ 操作の不頁もメジャーモードによって異なります。 インデントばかりではなく、キーバインドや実行できる ソル位置に文字を挿入します。たとえば、カーソルが 図 24 kanji. text を読み込んだときの画面 emcs はヨに良く出来ている . ーバインドの変更や カスタマイズ LISP による新しいコマンドの作成が お手軽にできる . kanji. text となります。 (Text) ー AI トー [EJJ-I abc@efg の位置にあって、 abc@defg こで、、 X 〃を入力すると、 となります。ところが、バッフアのマイナーモードが Over - write モードなら、 ab c@e f g で X を入力すると、 abc@efg 130 1 つのバッフアに対しては、 1 種類のメジャーモードと 複数のマイナーモードが指定できます。マイナーモードが 複数指定されている場合には、ウインドウの最下行にマイ ナーモードが書き並べられます。図 23 は、複数のマイナー モード Overwirte と Auto FiII を指定した場合の例です。 モードライン モードラインはバッフアの状態を示す特殊な行で、ウィ ンドウのいちはん下に表示されます。 GNU Emacs のモ ードラインには、 ・ノヾッファ名 ・バッフアが変更されたかどうかのフラグ なども表示されます。 ・ egg を使用しているときの egg のモード ・漢字コードの種類 などが表示されますが、 Nemacs ではこれら以外に、 ・日付、時刻の表示 ・ノヾッフアの表ノバ範囲 ・ノヾッフアのモード UNIX MAGAZINE 1990.9 画面表示です。左端の、 図 24 は、 kanji ・ text を読み込んだときの Nemacs の ったファイル、、 kanji. text 〃を読み込んでみましよう。 Nemacs のモードラインの表小を見るために、漢字の入

5. UNIX MAGAZINE 1990年9月号

emacs 入門 キーバインド さきほどのフロー制御の間題はこれでいちおう解決しま したが、この方法だとファイルを保存するたびにいちいち 、、 M-x save-buffer く CR>" と打ち込まなけれはなりませ ん。私などは、 「言 t 算機は落ちるもの。工デイタは core を吐くもの」 と信していて頻繁にファイルを保存するのですが、生来が 面倒くさがり屋なのでキー入力が多いと、 「えーい、なんてユーサー・インターフェイスの悪いプロ グラムなんだ」 と 1 日中、怒っていることでしよう。 えっ ? それくらいで怒っていては気が短すぎるって ? そうはいっても、プログラムを組むことを生業 4 としている 人間にとってはキー入力が多ければ健鞘炎や肩凝りのもと、 キーを打っ回数は少ないに越したことはありません。 Nemacs はそんな個人の健康にまで気を遣って ( ちょっと 大袈裟 ? ) キーの設定を変更できるようになっています。 関数や操作をキーに設定することを、、キーバインド〃と 呼びますが、 Nemacs の長所の 1 つに、このキーバインド を自由に変史できることが挙げられます。たとえは、さき ほどの save-buffer を C-x C マに割り当ててみましょ う。キーバインドを変更するための関数名は、 globa ト set Set key globally: を実行すると最下行に M ー x 9 ヒ旦く CR 〉 -key です。 と表示されます。 こで、 Set key globally: C-x C-z と入力すると、 Set key C-x C-z to command: 4 第なりわい〃と読んでくれましたよね。ん ? 誰です ? “ごうを ている人は。 126 と読んで納得し と訊き返されますから、このキーに対応させるコマンド名 save-buffer を次のように入力してください。 Set key C-x C-z to command: save-buffer これで、次からは C -x C-z でファイルを保存できるよ うになります。 ′ヾッファ やっとお手軽にファイルを保存できるようになったとこ ろで、新しいファイルを作りながら Nemacs の画面表示 について説明しましよう。今回は、 Lisp の教科書ではかな らすといってよいほどお呼びのかかる Lisp の階乗のプロ グラムさんと、同し内容の C のプログラムさんにお相手を 務めていただきます。次ページの図 13 と図 14 に控えてい らっしゃいますので、拍手でお迎えください。 ます、 % nemacs malll. C を実行して、 main. c を読み込みます。 Nemacs はファイルを読み込むと、そのファイルを保存 しておくための名前つきの領域を用意します。この領域は 、、バッファ〃と呼ばれ、ファイル名と同し名前がつけられま す。図 15 は main. c を読み込んた大態の Nemacs の画面 ですが、モードラインの中央付近に注目してください。 Nemacs: main. C と表示されているでしよう。この表示の右側がバッファ名 です。 このように、バッファ名は /doc/UNIMAGA/main. c というファイルを読み込んだときは、、 main. c 〃に factor- ial.el というファイルを読み込んだときには、、 factorial. el" となります。 こでクイズです。すでにあるバッファ名と同し名前の ファイルを読み込むとどうなるでしようか ? その場合に は、 2 番目に読み込んだファイルのバッファ名が、、ファイ ル名く 2 〉〃となります。同しように 3 番目のファイルは、、フ ァイル名く 3 〉〃、 4 番目のファイルは、、ファイル名く 4 〉〃とな ります。 たとえは、 /doc/UNIMAGA/main. c を読み込んでい UNIX MAGAZINE 1990.9