この訳はただのメモ書きであり、原著作者に許可を得て公開しているものではありません。
この節では入力文字ストリームからオブジェクトをパースするためのLispリーダーで使われるアルゴリズムを記述する。 Lispリーダーがマクロ文字をどのように処理するかということ含めて解説する。
トークンを扱う時、リーダーの基本的な機能はシンボル表現と数値表現を見分けることである。トークンが集約された時、
; polygon1.kn | |
; 正多角形の描画 | |
const RADIUS: float :: 300.0 | |
const CENTER: float :: 400.0 | |
var wndMain: wnd@Wnd | |
var drawMain: wnd@Draw | |
func drawPolygon(n: int) |
const WINDOW_WIDTH: float :: 600.0 | |
const WINDOW_HEIGHT: float :: 800.0 | |
; メインコード | |
var wndMain: wnd@Wnd | |
var drawMain: wnd@Draw | |
func main() | |
do @wndMain :: wnd@makeWnd( |
import Data.Bits | |
data Node = | |
Branch { b0 :: Node, b1 :: Node, b2 :: Node, b3 :: Node, | |
b4 :: Node, b5 :: Node, b6 :: Node, b7 :: Node, | |
b8 :: Node, b9 :: Node, ba :: Node, bb :: Node, | |
bc :: Node, bd :: Node, be :: Node, bf :: Node } | |
| Leaf Int | |
| Nil |
; 石宮鏡太郎さんの問題に対するオブジェクト指向を用いた回答 | |
; プログラミングでひとつ問題を出します。 | |
; | |
; if(a<b)if(c==0)method(e); else method(f); else if(d==0)method(e); else method(f); | |
; | |
; をあなたはどう簡潔に書きますか? | |
; 言語はCを想定していますが、別にどの言語で答えてもいいです。 | |
; | |
; みなさまのスタイルを期待しております。 |
; bseqkuina.kn | |
; B(?) sequence for 917 | |
; | |
func make917(n: int): []int | |
if(n = 1) | |
ret[1, 7, 9] | |
end if | |
var sml: []int :: @make917(n - 1) | |
var res: []int :: #[(^sml * 3)]int |
; sharp-a.cl | |
; [reader-macro #a] | |
; #a is an abbreviation of aref. | |
; | |
; [syntax] | |
; #a<symbol>(.<integer>)+ => (aref <symbol> <integer> ... <integer>) | |
; | |
; [example] | |
; (defvar a (make-array 5)) |
(defun whitespace-p (char) | |
(find char '(#\tab #\newline #\linefeed #\page #\return #\space))) | |
(defun terminating-character-p (char) | |
(find char '(#\" #\' #\( #\) #\, #\; #\`))) | |
(defvar *alternative-dot* (gensym "DOT-")) | |
(defun raw-reversed-left-parenthesis-reader (stream char) | |
"Reads the right strings of '(' | |
but single dot tokens '.' will be converted into *alternative-dot* |
; runnable.kn | |
; | |
{非推奨の組み込み関数} | |
+func[d0000.knd, _makeThread, _make_instance]makeThread( | |
|me2: task@Thread, threadFunc: func<()>): task@Thread | |
end func | |
+class Runnable() | |
; Runnableクラスは任意の名前のメソッドを |
import Control.Monad | |
import Control.Applicative | |
import Data.List | |
data Operation a = PushBack a | RandomAccess a | PopBack | |
showOp :: Operation Int -> String | |
showOp op = | |
case op of | |
PushBack x -> "PushBack " ++ (show x) |