PostScript で関数書き換え

関数オブジェクトから処理内容を取得して書き換える―を Squeak Smalltalk で - Smalltalkのtは小文字です 経由で

ただの言語には興味ありません。この中に「関数オブジェクトから関数の処理内容を取得して書き換えられる言語」「グローバル変数クロージャを使わずに、呼ぶ度に動作が変わる関数を作れる言語」「標準入出力へのIOが標準では存在しない言語」があったら僕に報告しなさい、以上。もう一度言ってみる

http://twitter.com/tana_ash/statuses/12767766389

文脈がよくわからないのですが、PostScript を念頭においているとしか思えません。既出だったり、PostScript が該当することは常識で他を探していたりした場合はご容赦願います。

関数オブジェクトから関数の処理内容を取得して書き換える

load 命令で関数オブジェクトを取得できます。PostScript の関数は配列なので、配列を書き換える要領で書き換えられます。

%!PS
% 数値に 1 を足す関数
/++ {
    1 add
}def

1 ++ = % => 2
1234 ++ = % => 1235

% 関数を読んで書き換えて、増分を 9 増やす
% 数値に 10 を足す関数になる
/++ load dup 0 get 9 add 0 exch put

1 ++ = % => 0
1234 ++ = % => 1233

グローバル変数クロージャを使わずに、呼ぶ度に動作が変わる関数

関数 self を書き換える関数をつくり、外から self の部分を自分自身に置き換えればよいです。

%!PS
% 挨拶し、自分自身を書き換える関数
{
    % 挨拶をする。
    % stop を {} に置き換えると挨拶が増える。
    {
        (Good morning! ) print stop exec
        (Good afternoon! ) print stop exec
        (Good evening! ) print stop exec
    }stopped pop
    % 挨拶する部分の stop を {} に置き換える
    self 0 get
    0 1 2 index length 1 sub{
        2 copy get /stop eq{
            2 copy {} put
            pop exit
        }if
        pop
    }for
    pop
}
% self の部分を自分自身に置き換える
dup 3 1 index put
% 1 度目の呼び出し
dup exec % => Good morning!
% 改行
()=
% 2 度目の呼び出し
dup exec % => Good morning! Good afternoon!
()=
% 3 度目の呼び出し
dup exec % => Good morning! Good afternoon! Good evening!
()=
% 4 度目の呼び出し
exec     % => Good morning! Good afternoon! Good evening!
()=

self は関数を置く場所を確保するためだけに存在しているので、実際には null でも文字列でも数値でも [ でも / でもかまいません。

標準入出力へのIOが標準では存在しない言語

大方の予想に反して、PostScript に標準入出力は存在するので、該当しません。
PostScript Language Reference (リンク先 PDF) Chapter 3 Language 3.8 File Input and Output によると、

All PostScript interpreters provide a standard input file and a standard output file, which usually represent a real-time communication channel to and from another computer.

とのこと。