2009/11/27

今までどのくらいプログラミング言語を触ってきたか

 

いまさら掘り返してみる。

(3秒で飽きたものも含め)

 

  • Delphi
  • C
  • JavaScript
    • JScript
    • Ejacs
    • Rhino
  • WSH
  • VB
    • VB6
    • VBA
  • SQL
  • C#
    • 1.1~3.5
  • F#
  • PowerShell
  • Ruby
  • PHP
  • Scheme
    • PLT
    • Gauche
    • IronScheme
  • Emacs Lisp
  • R
  • Common Lisp
  • PostScript
    • GhostScript
  • Erlang
  • Prolog
    • SWI-Prolog

 

含むならこの辺も

  • HTML
  • XML
  • XSLT
  • XAML

 

わりと長くやったもの

  • JavaScript
  • SQL
  • C#
  • Scheme
  • PostScript

 

JavaScriptはコアJavaScriptと言えば良いのか?DOMとかブラウザとか抜きで、関数型っぽいところとプロトタイプベースのオブジェクト指向が面白そうでやってみた。サイ本の後半には興味が持てなかった。Schemeで書いたコードをJSで書いてみたりというのも楽しんだ。Win環境で仕事の補助的な単純処理バッチも結構書いた(JScript)。

SQLとC#は仕事で2年半くらい結構みっちりやった。行数にして合わせて数十万行くらいは書いたと思う(一番書いた時で3万行/月くらい)。そのうち2年くらいは1.1だけど(笑)笑えない。MCTSも2.0なら3つとも取れた。MCPDは落ちたまま再挑戦してない。そのうちMCPD取って3.5にアップグレードしたいなーなどと思っていたが、今となってはどうだろうか。

Schemeはここ1年くらい結構継続してやってるけどずっと初級者。PostScriptはつい最近2ヶ月ほど入門的なことを。

ごく最近はPrologの入門的なことをだらだらと少々・・・。

 

将来設計はなし。興味が湧いた言語にただ手を出してるだけ。仕事はドロップアウト中。「自分探しの旅(笑)」とかに似たような現実逃避中なのかな。しかし結構充実している。たぶんやりたい放題だから。昼寝してやりたいことやって好きな時に自由にプログラミングしてるからかな。時間的余裕がたっぷりあるからなのかも。こういうスタイルで生活費でも稼げればラッキーなんだけどなー。

 

お金を稼げるプログラマになりたいな。それも"頑張り次第"とか"書いたら書いただけ"とか"仕事をさばいた分だけ、さばけばさばくほど"なんていうんじゃなくて、もっと怠惰にプログラマブルに。その方がプログラマっぽい。

 

華麗に脱線。

2009/11/21

Prolog 数値計算、述語

% X is 1 + 2 + 3.
% X = 6.

% X is 1 + 2, X is 3 + 4.
% false.

 

square(X, Y) :-
    Y is X * X.
/*
square(2, Y).
Y = 4.
square(2, 4).
true.
square(2, 10).
false.
*/

/*
  predicate
  >
  <
  >=
  <=
  =\= 等しくない
  =:= 等しい
*/

 

Prolog 空を飛ぶのは飛行機もしくはスーパーマン

fly(X) :-
    airplane(X).
fly(X) :-
    superman(X).

airplane(jet_plane).
airplane(helicopter).

superman(taro).

/*
fly(jet_plane).
true.

fly(taro).
true.

fly(Y).
Y = jet_plane ;
Y = helicopter ;
Y = taro.
*/

 

Prolog isono家

% 節?
male(namihei).
male(masuo).
male(katuo).
male(tara).
/*
male(X).
X = namihei ;
X = masuo ;
X = katuo ;
X = tara.
*/

female(fune).
female(sazae).
female(wakame).
/*
female(X).
X = fune ;
X = sazae ;
X = wakame.
*/

father_of(namihei, sazae).
father_of(namihei, katuo).
father_of(namihei, wakame).
father_of(masuo, tara).
/*
father_of(X, Y).
X = namihei,
Y = sazae ;
X = namihei,
Y = katuo ;
X = namihei,
Y = wakame ;
X = masuo,
Y = tara.
*/

 

mother_of(fune, sazae).
mother_of(fune, katuo).
mother_of(fune, wakame).
mother_of(sazae, tara).
/*
mother_of(X, Y).
X = fune,
Y = sazae ;
X = fune,
Y = katuo ;
X = fune,
Y = wakame ;
X = sazae,
Y = tara.
*/

 

% XはYの親である
% XがYの父親であるか、XがYの母親である
parent_of(X, Y) :-
    father_of(X, Y).
parent_of(X, Y) :-
    mother_of(X, Y).
/*
parent_of(X, sazae).
X = namihei ;
X = fune ;
false.

parent_of(X, Y).
X = namihei,
Y = sazae ;
X = namihei,
Y = katuo ;
X = namihei,
Y = wakame ;
X = masuo,
Y = tara ;
X = fune,
Y = sazae ;
X = fune,
Y = katuo ;
X = fune,
Y = wakame ;
X = sazae,
Y = tara.
*/

 

% XはYの息子である
% YはXの親であり、かつX
は男性である
suns_of(X, Y) :-
    parent_of(Y, X),
    male(X).
/*
suns_of(X, sazae).
X = tara.

suns_of(X, fune).
X = katuo ;
false.
*/

 

% XはYの娘である
% YはXの親であり、かつXは女性である
daughter_of(X, Y) :-
    parent_of(Y, X),
    female(X).
/*
daughter_of(X, Y).
X = sazae,
Y = namihei ;
X = wakame,
Y = namihei ;
X = sazae,
Y = fune ;
X = wakame,
Y = fune ;
false.
*/

 

% XはYの祖父である
% ZはYの親であり、XはZの父である
grandfather_of(X, Y) :-
    parent_of(Z, Y),
    father_of(X, Z).
/*
grandfather_of(X, Y).
X = namihei,
Y = tara ;
false.
*/

/*
grandfather_of(X, Y).
X = namihei,
Y = tara
*/

 

% XはYの祖母である
% ZはYの親であり、XはZの母
grandmother_of(X, Y) :-
    parent_of(Z, Y),
    mother_of(X, Z).

/*
grandmother_of(X, Y).
X = fune,
Y = tara
*/

 

Prolog 階乗

% 階乗
fact(0, 1).
fact(X, Y) :-
    X > 0,
    X1 is X - 1,
    fact(X1, Y1),
    Y is X * Y1.
fact(5, 120).


% ?- fact(5, Y).
% 120

% 外部ファイルの読み込み
% ['c:/program files/pl/demo/likes.pl'].


% pwd : カレントフォルダ
% ls : カレントフォルダ内のファイルを表示

% comment
/*
  comments
*/

 

Prolog ソクラテスは人間である

% socrates
human(socrates).

mortal(X) :-
    human(X).

/*

mortal(Y).
Y = socrates.

human(Y).
Y = socrates.

human(socrates).
true.

mortal(socrates).
true.

*/

% 終了は
% halt.

*mortal : 死ぬ運命にある、死を免れない

Prolog PDF 他

(PDF)Prolog入門

(PDF)Prologue: Prologを動かすには

Prologプログラミング: 再帰的プログラミング

Prolog準備

お気楽 Prolog プログラミング入門
Prolog Programming

Prolog演習

Prolog演習

Some Coding Guidelines for Prolog

Prolog(Web Console)

Guide to Prolog Programming

Prolog Programming A First Course

prolog :- tutorial

Learn Prolog Now!

The Prolog Dictionary

Prolog Tutorial




Erlang Hello world!, factorial, fibonacci

Hello world!

-module(hello).
-export([hello/0]).

hello () ->
    io : fwrite("Hello, world!~n", []).
% hello:hello().
% Hello, world!
% ok

factorial

-module(fact).
-export([fact/1]).

fact(1) ->
    1;
fact(N) ->
    N * fact(N-1).

% fact:fact(5).
% 120

fibonacci

% 一般的にファイル名と同じ名称を指定する
-module(fib).
% モジュール外から使用する関数とその引数の数を記述
-export([fib/1]).
% 全ての関数をエクスポートするには
% -compile(export_all).
% 定数定義、レコード定義のインクルード
% -include_lib("hoge.hrl").

fib(1) ->
    1;
fib(2) ->
    1;
fib(N) ->
    fib(N-1) + fib(N-2).

 

C-c C-k コンパイル

Prolog 階乗

% 階乗
fact(0, 1).
fact(X, Y) :-
    X > 0,
    X1 is X - 1,
    fact(X1, Y1),
    Y is X * Y1.
fact(5, 120).


% ?- fact(5, Y).
% 120

% 外部ファイルの読み込み
% ['c:/program files/pl/demo/likes.pl'].

% ; : 選択(「もしくは」のようなニュアンス?)
% pwd : カレントフォルダ
% ls : カレントフォルダ内のファイルを表示

 

% comment
/*
  comments
*/

 

2009/11/20

Erlang PDF 他

erlang.pdf

Concurrent Programming in ERLANG Second Edition

Thinking in Erlang

Erlangの並列計算の入り口

Getting Started with Erlang

Concurrency Oriented Programming in Erlang

Program Development Using Erlang - Programming Rules and Conventions

Thinking in Erlang (Japanese version)

Erlang入門



Prolog PDF

論理プログラミング言語Prologの基礎

初級Prolog 講座

【Prolog(JunPrologInterpreter)マニュアル】

SWI-Prolog 5.0 Reference Manual

prolog.pdf
DB

SWI-Prolog の使い方

帰納論理プログラミング 第2回 Prolog

Introducing Prolog II

GNU PROLOG MANUAL

The.Art.of.Prolog.Advanced.Programming._1999__.2Ed._0262193388_.

Prolog A Tutorial Introduction

Introduction to Prolog

Prolog入門

Prolog入門(自習用)

A Prolog Interpreter in Python

ebook.The Art of PROLOG - 2nd Edition Advanced Programming Techniques
Logic Progra.0262193388 .zip


Prolog(プロログ)を学ぶ―文化とその実践Prologへの入門 (PrologとAI)



2009/11/19

PostScript DSCコメント, ページ, page

 

%!PS-Adobe-3.0
%%Pages: 3

% PostScript実習マニュアル
% P.70 DSC

% %%Title
% %%EOF
% %%Page
% %%Pages
% %%BoundingBox

% P.71 page.ps
/showstring {
    1 dict begin
        /string exch def
        100 500 moveto
        0 0.6 0 setrgbcolor
        /Times-Roman findfont 128 scalefont setfont
        string show
        showpage
    end
} def

%%Page: (first page) 1
(first) showstring
%%Page: (second page) 2
(second) showstring
%%Page: (third page) 3
(third) showstring

 

そうそう、2ページ目以降ってどうやるんだろうって思ってたんだった。この方法だけなのかな。

PostScript gsave grestore

gsave-grestore.ps

 

 

%!PS-Adobe-3.0
% PostScript実習マニュアル
% P.68 3.11 グラフィックス状態の保存

/square {
    2 dict begin
        /y exch def
        /x exch def
        x y moveto
        200 0 rlineto
        0 200 rlineto
        -200 0 rlineto
        fill
    end
} def

/specialsquare {
    gsave
        200 200 translate
        50 rotate
        2 0.5 scale
        0.4 0.8 0 setrgbcolor
        0 0 square
    grestore
} def

0 0.4 0.8 setrgbcolor
200 100 square
specialsquare
200 500 square
showpage

 

 

PostScript Clip Star

clip-star.ps

 

 

%!PS-Adobe-3.0
% PostScript実習マニュアル
% P.67 3.10 クリッピング

% clip
% eoclip
% initclip

/star {
    2 dict begin
        /y exch def
        /x exch def
        newpath
        x y moveto
        300 0 rlineto
        -250 -200 rlineto
        100 300 rlineto
        100 -300 rlineto
    end
} def

/polkadot {
    4 dict begin
        /y exch def
        /x exch def
        /dy y def
        14 {
            /dy dy 25 add def
            /dx x def
            14 {
                /dx dx 25 add def
                newpath
                dx dy 8 0 360 arc
                stroke
            } repeat
        } repeat
    end
} def

/polkadotstar {
    150 650 star
    clip
    100 400 polkadot
} def

/polkadotstarbyeo {
    150 300 star
    eoclip
    100 50 polkadot
} def

1 0 0.4 setrgbcolor
6 setlinewidth
polkadotstar
initclip
polkadotstarbyeo
showpage

 

 

PostScript ベジェ曲線

bezier-1.ps bezier-2.ps

 

bezier-1.ps

%!PS-Adobe-3.0
% PostScript実習マニュアル
% P.58 3.7 ベジェ曲線

% P.58 3.7.1 ベジェ曲線の基礎
/bezier {
    8 dict begin
        /y3 exch def
        /x3 exch def
        /y2 exch def
        /x2 exch def
        /y1 exch def
        /x1 exch def
        /y0 exch def
        /x0 exch def
        newpath
        x0 y0 moveto
        x1 y1 x2 y2 x3 y3 curveto
        0 0.8 1 setrgbcolor
        40 setlinewidth
        stroke
        newpath
        x0 y0 moveto
        x1 y1 lineto
        x2 y2 moveto
        x3 y3 lineto
        1 0 0 setrgbcolor
        1 setlinewidth
        stroke
    end
} def

140 450 100 650 500 750 300 450 bezier
140 150 100 350 300 150 500 450 bezier
showpage

bezier-2.ps

%!PS-Adobe-3.0
% PostScript実習マニュアル
% P.58 3.7 ベジェ曲線

% P59 3.7.3 ベジェ曲線の連結
/bezbez {
    14 dict begin
        /y6 exch def
        /x6 exch def
        /y5 exch def
        /x5 exch def
        /y4 exch def
        /x4 exch def
        /y3 exch def
        /x3 exch def
        /y2 exch def
        /x2 exch def
        /y1 exch def
        /x1 exch def
        /y0 exch def
        /x0 exch def
        newpath
        x0 y0 moveto
        x1 y1 x2 y2 x3 y3 curveto
        x4 y4 x5 y5 x6 y6 curveto
        0 1 0.8 setrgbcolor
        30 setlinewidth
        stroke
        newpath
        x0 y0 moveto
        x1 y1 lineto
        x2 y2 moveto
        x3 y3 lineto
        1 0 0 setrgbcolor
        1 setlinewidth
        stroke
        newpath
        x3 y3 moveto
        x4 y4 lineto
        x5 y5 moveto
        x6 y6 lineto
        0 0 1 setrgbcolor
        stroke
    end
} def

150 600 100 750 350 700 250 600 300 450 500 400 400 600 bezbez
150 300 100 450 350 400 250 300 100 150 500 100 400 300 bezbez
showpage

 

  • PostScript実習マニュアル
  • PostScript - PDF,Web まとめ
  • PostScript 日本語フォント

     

    PostScript実習マニュアル
    P.63 3.8.10 日本語のフォント

    Ryumin-Light-RKSJ-H 明朝体の横組み。
    Ryumin-Light-RKSJ-V 明朝体の縦組み。
    GothicBBB-Medium-RKSJ-H ゴシック体の横組み。
    GothicBBB-Medium-RKSJ-V ゴシック体の縦組み。

    ちなみに、これらのフォント名を持つフォント辞書は、文字コードとしてShift JIS を使っています。これらのフォント名に含まれているRKSJ という部分をEUC に置き換えると、文字コードとしてEUC-JP を使うフォント辞書の名前になります。

    2009/11/18

    PostScript 色, setrgbcolor, setcmykcolor, setgray, 線, setlinecap, setlinejoin, setlinemilter, setdash

    setrgbcolor.pscmykcolor.ps setgray.ps cap.psjoin.psmiter.ps dash.ps rowdash.ps

     

     setrgbcolor.ps

    % P.50 3.4 色 3.4.2 加法混色
    % red green blue setrgbcolor

    % rgb
    /hline {
        5 dict begin
            /blue exch def
            /green exch def
            /red exch def
            /y exch def
            /x exch def
            newpath
            x y moveto
            30 0 rlineto
            30 setlinewidth
            red green blue setrgbcolor
            stroke
        end
    } def

    /hundredlines {
        4 dict begin
            /red 0 def
            300 40 660 {
                /y exch def
                /green 0 def
                100 40 460 {
                    /x exch def
                    x y red green 0 hline
                    /green green 0.1 add def
                } for
                /red red 0.1 add def
            } for
        end
    } def
    hundredlines
    showpage

    cmykcolor.ps 

    % P.51 3.4.3 減法混色
    % cyan magenta yellow black setcmykcolor

    /hline {
        6 dict begin
            /black exch def
            /yellow exch def
            /magenta exch def
            /cyan exch def
            /y exch def
            /x exch def
            newpath
            x y moveto
            30 0 rlineto
            30 setlinewidth
            cyan magenta yellow black setcmykcolor
            stroke
        end
    } def

    /hundredlines {
        4 dict begin
            /cyan 0 def
            300 40 660 {
                /y exch def
                /magenta 0 def
                100 40 460 {
                    /x exch def
                    x y cyan magenta 0 0 hline
                    /magenta magenta 0.1 add def
                } for
                /cyan cyan 0.1 add def
            } for
        end
    } def
    hundredlines
    showpage

    setgray.ps

    % setgray
    /dline {
        newpath
        150 100 moveto
        300 600 rlineto
        40 setlinewidth
        stroke
    } def

    /hline {
        2 dict begin
            /gray exch def
            /y exch def
            newpath
            100 y moveto
            400 0 rlineto
            30 setlinewidth
            gray setgray
            stroke
            end
    }def

    /elevenlines {
        3 dict begin
            /gray 0 def
            200 40 600 {
                /y exch def
                y gray hline
                /gray gray 0.1 add def
            } for
        end
    } def

    dline
    elevenlines
    showpage

    cap.ps

    % cap
    /hline {
        2 dict begin
            /cap exch def
            /y exch def
            newpath
            150 y moveto
            300 0 rlineto
            100 setlinewidth
            0.5 1 1 setrgbcolor
            cap setlinecap
            stroke
            newpath
            150 y moveto
            300 0 rlineto
            1 setlinewidth
            1 0 0 setrgbcolor
            0 setlinecap
            stroke
        end
    }def

    650 0 hline
    500 1 hline
    350 2 hline
    showpage

    join.ps

    % join
    /harpoon {
        2 dict begin
            /join exch def
            /y exch def
            newpath
            150 y moveto
            250 0 rlineto
            -150 120 rlineto
            80 setlinewidth
            0.5 1 1 setrgbcolor
            join setlinejoin
            stroke
            newpath
            150 y moveto
            250 0 rlineto
            -150 120 rlineto
            1 setlinewidth
            1 0 0 setrgbcolor
            0 setlinejoin
            stroke
        end
    }def

    600 0 harpoon
    400 1 harpoon
    200 2 harpoon
    showpage

    miter.ps 

    % join
    /harpoon {
        2 dict begin
            /join exch def
            /y exch def
            newpath
            150 y moveto
            250 0 rlineto
            -150 120 rlineto
            80 setlinewidth
            0.5 1 1 setrgbcolor
            join setlinejoin
            stroke
            newpath
            150 y moveto
            250 0 rlineto
            -150 120 rlineto
            1 setlinewidth
            1 0 0 setrgbcolor
            0 setlinejoin
            stroke
        end
    }def

    600 0 harpoon
    400 1 harpoon
    200 2 harpoon
    showpage

    dash.ps

    % dash
    /vline {
        newpath
        100 150 moveto
        100 750 lineto
        500 150 moveto
        500 750 lineto
        1 0 0 setrgbcolor
        stroke
    } def

    /hline {
        3 dict begin
            /offset exch def
            /array exch def
            /y exch def
            newpath
            100 y moveto
            400 0 rlineto
            0 0.4 0.8 setrgbcolor
            40 setlinewidth
            array offset setdash
            stroke
        end
    }def

    vline
    700 [] 0 hline
    600 [ 30 10 ] 0 hline
    500 [ 20 ] 0 hline
    400 [ 10 20 30 ] 0 hline
    300 [ 50 10 10 10 ] 0 hline
    200 [ 50 10 10 10 ] 20 hline
    showpage

    rowdash.ps

    % roudash
    newpath
    100 200 moveto
    400 0 rlineto
    -200 500 rlineto
    closepath
    60 setlinewidth
    0.4 0.8 0 setrgbcolor
    1 setlinecap
    1 setlinejoin
    [200 80] 0 setdash
    stroke
    showpage

     

  • PostScript実習マニュアル
  • PostScript - PDF,Web まとめ
  • PostScript file, ファイルIO

     

    access string

    % P.40 2.13 ファイル 2.13.2 ファイルのオープン
    % /in (hoge.txt) (access string) file def

    % access string
    % r
    % w
    % a
    % r+
    % w+
    % a+

     

    % P.43 2.13.8 標準入出力のファイルオブジェクト
    % 標準入力 %stdin
    % 標準出力 %stdout
    % 標準エラー %stderr
    % /in (%stdin) (r) file def

     

    IO関連オペレータ

    % file
    % closefile
    % read
    % readline
    % readstring
    % token
    % write
    % writestring
    % print
    % deletefile
    % renamefile

     

    読み込み

    /cat {
        3 dict begin
            /path exch def
            /in path (r) file def
            /s 256 string def
            {
                in s readline not {
                    pop exit
                } if
                =
            } loop
            in closefile
        end
    } def

    (c:/test.txt) cat
    % test
    % aaa
    % bbb
    % ccc

    % c:/test.txt
    % test
    % aaa
    % bbb
    % ccc

     

    コピー

    /copy {
        4 dict begin
            /path2 exch def
            /path1 exch def
            /in path1 (r) file def
    %         /out path2 (w) file def
            /out path2 (a+) file def
            {
                in read not {
                    exit
                } if
                out exch write
            } loop
            in closefile
            out closefile
        end
    } def

    (c:/test.txt) (c:/test1.txt) copy

     

    PostScript mmへの変換

    /mm {
        2.834646 mul
    } def

     

    PostScript fill, eofill

    fill-eofill-star

    % P.50 3.3.6 領域の内部性の判定

    /star {
        2 dict begin
            /y exch def
            /x exch def
            newpath
            x y moveto
            300 0 rlineto
            -250 -200 rlineto
            100 300 rlineto
            100 -300 rlineto
        end
    } def

    0 0.4 0 setrgbcolor
    150 650 star
    fill
    150 300 star
    eofill
    showpage

     

  • PostScript実習マニュアル
  • PostScript - PDF,Web まとめ
  • memo

    総論 複数のプログラミング言語を学ぶ意義

    (PDF)複数のプログラミング言語を学ぶ意義 - まつもとゆきひろ

    Oz

    第1回 関数型プログラミングの世界へようこそ

    プログラミングを独習するには10年かかる

    GoldenScheme - Scheme on JavaScript

    和田英一@日本初のハッカーは、ちょっと変わった絵を描く
    LispとPostScriptさえあれば、私はハッピーになれる

    わーい \(^o^)/ LispをPostScriptで書いたLispで書いたよー!

    PHPは駄目な言語なのか?

    Attacking PHP
    世の中には「おかしなコードを書くことを助長する言語」もある という点だ。
    「PHPなめんな」と「(Perl|Python|Ruby)をなめんな」の違い

    悪いのはPHP自体じゃないかもしれないけど

    プログラミング言語は自由度が低いほど強力か?
    Factorに乗り換えるプログラマーは、Factorのより高位なプログラミング力を手に入れるために、ローカル変数を放棄しなくてはなりません。

    プログラム・プロムナード / Haskellプログラミング



    Fortranから最新言語まで、約2500種類のプログラミング言語の系図

    The History of Programming Languages

    TIOBE Programming Community Index for November 2009

    programming languages history

    Search for a particular language entry

    Computer Languages History - Computer Languages Timeline

    人工言語264種類、自然言語42種類のHello World

    The Hello World Collection

    プログラミング好きは2種類ある。

    DSLに関する読み物

    伝統的な言語指向プログラミング

    Schemeでラムダ計算

    ラムダ計算ABC

    JavaScriptで学ぶ・プログラマのためのラムダ計算

    プログラミング言語論教材

    プログラミング言語論教材/関数型言語

    Church Numerals と Lambda Calculus アルゴリズムとデータ構造入門 補足

    数理科学的バグ撲滅方法論のすすめ 第16回 すべてのものは関数である

    なんでもλ

    keisanki-software-kougaku-2005

    PostScript フィボナッチ数

    %!PS-Adobe-3.0
    % fibonacci

    /fib {
        1 dict begin
            /n exch def
            n 0 eq n 1 eq or {
                n
            } {
                n 2 sub fib
                n 1 sub fib
                add
            } ifelse
        end
    } def

    20 fib % 6765

     

    PostScript 階乗

    %!PS-Adobe-3.0 
    % factorial
    
    /fact { 
        1 dict begin 
            /n exch def 
            n 1 eq n 0 eq or { 
                1 
            } { 
                n 1 sub fact n mul 
            } ifelse 
        end 
    } def
    
    5 fact % 120

    PostScript GhostScript, some operators

     

    GS>(abcdefghijk) 3 4 getinterval ==
    (defg)

     

    GS>/s (abcdefghijk) def
    GS>s 3 (WXYZ) putinterval
    GS>s ==
    (abcWXYZhijk)

     

    GS>(437) cvi ==
    437

     

    GS>(3.14) cvr ==
    3.14

     

    GS>(kpf) cvn ==
    /kpf

     

    GS>437 3 string cvs ==
    (437)

     

    GS>(kpf) (9LISP) 123 5
    GS<4>pstack
    5
    123
    (9LISP)
    (kpf)

     

    GS<4>stack
    5
    123
    9LISP
    kpf
    GS<4>

     

    GS>(kpf) (9LISP) (hoge)
    GS<3>pop
    GS<2>stack
    9LISP
    kpf

     

    GS<2>count ==
    2
    GS<2>count

    GS<3>stack
    2
    9LISP
    kpf
    GS<3>pop
    GS<2>count ==
    2

     

    GS<2>clear
    GS>stack
    GS>

     

    GS>398 dup
    GS<2>pstack
    398
    398

     

    GS<2>(a) (b) (c) 2 index
    GS<6>pstack
    (a)
    (c)
    (b)
    (a)
    398
    398

     

    GS<6>(a) (b) (c) 3 copy
    GS<12>pstack
    (c)
    (b)
    (a)
    (c)
    (b)
    (a)
    (a)
    (c)
    (b)
    (a)
    398
    398

     

    GS<12>clear

     

    GS>(a) (b) (c) exch
    GS<3>pstack
    (b)
    (c)
    (a)

     

    GS<3>(9) (L) (I) (S) (P) 4 3 roll
    GS<8>pstack
    (L)
    (P)
    (S)
    (I)
    (9)
    (b)
    (c)
    (a)
    GS<8>

     

    GS>100 mark 1 2 3 4 5
    GS<7>pstack
    5
    4
    3
    2
    1
    -mark-
    100

     

    GS<7>counttomark
    GS<8>==
    5
    GS<7>counttomark ==
    5

     

    GS<7>cleartomark
    GS<1>pstack
    100
    GS<1>

    PostScript 配列を扱う手続き

     

    %!PS-Adobe-3.0
    % P.38 2.12.4 配列を扱う手続き

    /reverse {
        5 dict begin
            /ary exch def
            /n a1 length def
            /ret n array def
            0 1 n 1 sub {
                /i exch def
                /e ary i get def
                ret n i sub 1 sub e put
            } for
            ret
        end
    } def

    [1 2 3 4 5] reverse ==

    %!PS-Adobe-3.0
    % P.39 2.12.4 配列を扱う手続き
    % sum array elements

    /suma {
        2 dict begin
            /ary exch def
            /ret 0 def
            ary {
                /ret exch ret add def
            } forall
            ret
        end
    } def

    [1 2 3 4 5 6 7 8 9 10] suma == % 55

    %!PS-Adobe-3.0
    % P.40 2.12.4 配列を扱う手続き

    /amap {
        6 dict begin
            /f exch def
            /ary exch def
            /n ary length def
            /ret n array def
            0 1 n 1 sub {
                /i exch def
                /e ary i get def
                ret i e f put
            } for
            ret
        end
    } def

    [1 2 3 4 5] { 10 mul } amap ==
    % [10 20 30 40 50]
    [true false false true] { { 1 } { 0  } ifelse } amap ==
    % [1 0 0 1]

    PostScript hour minute to minute

     

    %!PS-Adobe-3.0
    % P.24 2.6.6 オペランドへの名前の束縛
    % hour時間minute分を分に変換
    /hmtom {
        2 dict begin
            /minute exch def
            /hour exch def
            hour 60 mul minute add
        end
    } def

    2 30 hmtom ==
    % 150

    PostScript 外部ファイル読み込み

    %!PS-Adobe-3.0
    123

    %!PS-Adobe-3.0

    /Times-Roman findfont 100 scalefont setfont
    200 200 moveto
    (sample.ps) run
    3 string cvs show
    showpage

    PostScript 繰り返し

     

    %!PS-Adobe-3.0
    % P.30 2.9.2 回数による繰り返し
    /power {
        3 dict begin
            /i exch def
            /n exch def
            /p 1 def
            i {
                /p p n mul def
            } repeat
            p
        end
    } def

    3 4 power == % 81

    %!PS-Adobe-3.0
    % P.30 2.9.3 制御変数による繰り返し
    % 引数の全ての約数を出力する

    /divisor {
        mod 0 eq
    } def

    /alldivisors {
        2 dict begin
            /max exch def
            1 1 max {
                /i exch def
                max i divisor {
                    i ==
                } if
            } for
        end
    } def

    %!PS-Adobe-3.0
    % P.31 2.9.4 条件による繰り返し

    % 最大公約数を求める(ユークリッドの互助法)
    %     ステップ1 与えられた二つの整数のそれぞれをn とm とする。
    %     ステップ2 m が0 ならば計算を終了する。
    %     ステップ3 n をm で除算したあまりをr とする。
    %     ステップ4 m をn とする。
    %     ステップ5 r をm とする。
    %     ステップ6 ステップ2 に戻る。

    /gcm {
        3 dict begin
            /m exch def
            /n exch def
            {
                m 0 eq {
                    exit
                } if
                /r n m mod def
                /n m def
                /m  r def
            } loop
            n
        end
    } def

    54 36 gcm == % 18

    PostScript 高階手続き

     

    %!PS-Adobe-3.0
    % P.35 2.11 高階手続き
    % higher order procedure

    /twice {
        1 dict begin
            /proc exch def
            proc proc
        end
    } def

    { (KPF) == } twice % (KPF)(KPF)

    /sum {
        2 dict begin
            /f exch def
            /n exch def
            n 1 eq {
                1 f
            } {
                n 2 ge {
                    n f
                    n 1 sub
                    /f load
                    sum add
                } {
                    (undefined)
                } ifelse
            } ifelse
        end
    } def

    10 { } sum == % 55
    10 { dup mul } sum == % 385
    10 { dup dup mul mul }  sum == % 3025