Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-05-24

Getting Started in *LISP (10)

| 16:19 | Getting Started in *LISP (10) - わだばLisperになる を含むブックマーク はてなブックマーク - Getting Started in *LISP (10) - わだばLisperになる

2.7 Defining *Lisp Functions and Macros

この章では、関数とマクロをどう定義してゆくかを解説

2.7.1 To Define a Function, Use defun

関数定義には、通常のCLのように、defunが使える

(defun add-mult!! (a b c)
  (*!! (+!! a b) c))

(ppp (ADD-MULT!! 1 2 3) :end 12)
;>>> 9 9 9 9 9 9 9 9 9 9 9 9 
;==> nil

(*defvar my-pvar 1)

(*set my-pvar (add-mult!! my-pvar -6 (self-address!!)))

(ppp my-pvar :end 12)
0 -5 -10 -15 -20 -25 -30 -35 -40 -45 -50 -55 NIL

という風に割とCLのまま書ける。

*Lispには、*defunというものも用意されているが、特殊な状況を除き使用する必要はなく、殆どdefunでまかなえるとのこと。

2.7.2 To Define a Macro, Use defmacro

マクロの定義もお馴染みのdefmacroで定義。

(defmacro *two-incf (pvar)
  `(*set ,pvar (+!! ,pvar 2)))

(*TWO-INCF my-pvar)

(ppp my-pvar :end 12)
;>>> 2 -3 -8 -13 -18 -23 -28 -33 -38 -43 -48 -53
;==> NIL

というようにCLそのままな感じ。

2.8 Compiling *Lisp Code

コンパイルについてもCLと同様で、関数単位、ファイル単位で可能。

(compile 'add-mult!!)

(compile-file "starlisp-code.lisp")
(load "starlisp-code")
  • A Note about Declarations

コンパイラへの宣言については、*Lispでは、関数の引数と返り値の型を完全に明確に宣言しないと、完全にコンパイルされないということに注意せよ、とのこと。

詳細は、5章で解説。

完全な宣言の例

(defun add-mult!! (a b c)
  (declare (type (pvar (signed-byte 32)) a b c))
  (*!! (+!! a b) c))

型宣言しなければ、コンパイルされないわけではなく、パフォーマンス等で機能を十全に発揮させるには、型宣言が必要になることに注意せよ、とのこと。

2.9 Summary: How *Lisp and Common Lisp Are Similar

CLと*Lispの共通点についてのまとめ

  • pvarは、CLのアレイのようなもの
  • pvarのプリティプリントにはpppがある
  • 並列動作する関数は、pvarに対して動作する並列版CL関数ともいうべきもの
  • defunや、defmacro等CLと同じものが使える
  • コンパイラは、*Lisp用に拡張されたCLのコンパイラのようなもの

次回、3章から再開です。