文字列ぐるぐる(2003/10/07)


Emacs LISP

指定した領域を逆転する関数

(defun reverse-string-region ()
  "reverse string of region"
  (interactive)
  (let* ((str (reverse-string 
	       (buffer-substring (region-beginning) (region-end) (current-buffer)))))
    (kill-region (region-beginning) (region-end))
    (insert-string str)))


(defun reverse-string (&optional str  ret)
  ""
  (cond
   ((equal str "")      ret)
   ((not (equal str ""))
    (reverse-string (substring str 1) (concat (substring str 0 1) ret)))))

数関るす転逆を域領たし定指 ← 実行結果

意外とこういうしょうもない関数が無かったりする。 いや、あるのかも知れんが、みつからなかった。 そこで、 たいして役に立たない事を承知で作ってみた。

最初の関数が、インターフェース部分。領域を指定して、 M-x で呼べば、その部分の文字列が 逆転する。 下の関数がこのインターフェースが使用する文字列逆転エンジン(わはは)。 絶対使わないとは思うが、万一どこかで再び使う事が無いとは言えず、 そんなことがもしあったとしたら憤屍確定なので、 インターフェースと文字列操作部分は分離して作成した。

。ルイタスグンィデーコの房厨 PSIL てい書で帰再てえ敢をこそ 、どけだんうゃち出にぐすがーラエ htped-lave-psil-xam とるす作操を列字文い長とっょち 、でのたい書で帰再ざわざわ

なお、 reverse-region という関数は存在し、 これは行の順番を逆にする。こんな感じ

これに reverse-region すると

ぐるぐるコンビナート

しょうもない関数ができたところで、この関数で遊んでみよう。

次の二つの文字列がある。言うまでもなく、下の文字列は上の文字列を 関数 reverse-string の引数として与えた値である。

始発駅→終着駅
駅着終→駅発始

上の文字列の読み方は、慣習により一意に決定されるであろう。 通常のとおり、左から順に読めば良い。 だが、下の文字列の読み方は必ずしも一意ではないように感じられる。 ここは一つ、右から通して読んでみよう。 するとどうだ。上は通常の運転だが下は回送列車になってしまった。

普通の文字は、縦だろうが横だろうがグルグルまわっていようが、 レイアウトと意味内容は無関係である。 しかし、この二つの文字列を見れば、 どうやらレイアウトが意味内容に本質的に関係する表現が存在するようだ。

なぜ矢印の意味内容には、文字列のレイアウトが本質的に関係するのだろうか? 逆に、なぜ他の文字列ならば、レイアウトは意味内容に無関係なのだろうか? たかが矢印だが、我々の使う言語にはなかなか深く微妙な構造が存在しているようだ。

通常の言語では、記号の読まれる順序だけが問題になる。並びが逆なら読む順序を 逆にすれば、読まれる順序は保存される。順序というのは、こういう性質だ。

これさえ満たされておれば、幾何学的配置はどうでもよいのである。 これは俺の妄想だが、文字表記された言語に先行する、 喋り言語が時系列に乗っかった音の連鎖を記号として用いたので、 わしらの言語モジュール(脳内にあるアレ) がそういう実装で決め打ち状態なのであろう。

さて、矢印には出発点と終着点がある。出発点と終着点に何かモノがあって初めて 何か意味が出る。これはそういう記号だ。 いわば二つの引数をとる関数である。 左にあったものが右に移れば引数の順序は変化し、 引数の順序が変われば値が変化するのは当然のこと。あったり前じゃないですか。 何か疑問でも?

甘い!アマ過ぎる!ゼーンゼン解決されてない! 二つの引数をとる表現であっても、例えば "体積+面積" などの表現では文字列の順序を逆転しても引数の順序は変化しない。 何故矢印の場合は引数の順序が変化するのか?

それは、矢印がとる引数の順序に、幾何学的規定が存在するからである。 割算を "/" で表現した場合も似た規定が存在する。 そこで、この規定を破壊してみよう。 とにかく、俺はこの演算子のまんなか配置というこのダセェ表記が我慢ならねんだよ! いちいち文字列ひっくり返したくらいでブっ壊れやがってよ!アホじゃねーの? ってことで、とりあえずポーランド記法で LISP 風に

(→ 始発駅 終着駅)

ではこれを逆転して

(駅着終 駅発始 →)

みろよ!逆から読んでも全く意味変化も生じないぜ。 ってことで、やっぱポーランド記法は最強にして最高。 引数を二つまでしか取れない上に脆弱でダサい演算子まんなか表記は、 あらゆる殲滅しよう。


記事リストへ