Scheme は目に優しいか

毎日ちょっとづつ Scheme をいじっていて、「Scheme って目に優しいかも」と思った。主に、Perl と比べて、だけど。


「さあ昨日の続きを書こう」と思ってエディタでファイルを開いたときに目に飛び込んでくる characters の種類によって、精神に与えるダメージの大きさが違うように思う。


Scheme のソースは括弧 '(', ')'セミコロン ';' が多く、Perl のソースはドルマーク '$' と、アンパサンド '&' と、シャープ '#' が多い気がする。


括弧は、その形状が「シュッ」としているので、シャープやドルマークに比べて「うげげ!」感が小さいように思う。

実験

ASCII 表を見ながら、こんな scheme のプログラムを書いてみた。
やってることは、標準入力を読んで、記号だけを出力する。(スペース、アルファベット、数字、制御文字は表示しない。)

#! /usr/bin/env gosh

(define (main args)

  (let loop ()
    (let1 c (read-char)
      (cond ((eof-object? c) #f)
        ((or
           (and (char>=? c #\!) (char<=? c #\/))
           (and (char>=? c #\:) (char<=? c #\@))
           (and (char>=? c #\[) (char<=? c #\`))
           (and (char>=? c #\{) (char<=? c #\~)))
         (write-char c)
         (loop))
        (else (loop)))))

  0)


これを symbol_only.scm という名前で保存し、このプログラムに、手元の scheme ファイルを食わせてみる。

% find ~/prog/scm -name '*.scm' | xargs cat | ./symbol_only.scm


実行結果:

#!////(()()(()())((-))((())((<)(-!(+(-)))()((+)))))#!///(()((--)((((-)))((-?)()((
--)(--))((-))))))#!////((--)(-(((-(()(!(+))))(-(()(!(-)))))(--))))(()(()(-)(())((
))(())(())(())(())))#!////(()('(#\#\#\#\#\#\#\#\))(--))((-)(#"\")(((--?#[\])(""))
(("")))(((-?)(""))((""))))#!////(()((--"/")(((-)((-)))((-?)(#":\"-)((+-)(-))))))#
!///(()(()((-)(((-?)#)((((>=?#\!)(<=?#\/))((>=?#\:)(<=?#\@))((>=?#\[)(<=?#\`))((>
=?#\)(<=?#\`)))(-)())(())))))#!////(-)(-)()(.)(--!--)((--)(-(()(-))))(()((())((>)
((--)(-!(->);(#"\"));((-))))))(()(()(#":\"))(--))(()(')(((?')((-<>:"":-:)()(-)))(
(?')((-<>:"":-:)()(-)))))#!////((-)((((--#/\\/(--#/\*(\+)/"\\")"")))))(()(-(-'(":
::::::"":::::::"":::::::"":::::::"":::::::"":::::::"))))#!////(-)(-)((-)((-)((()(
))(((?))((?())(()(+)))())))((--)((()()()())(((?)((>)()()))((*-((()((-)))(()((>)()
())))#;(#"***===\")(()(+)))))))(((-><>)(-#\:))(-((()(--)))(((-><>))(((?))((-(-()"
:")"::"(-((+))":"))))))))(()(-'(":::::::"":::::::"":::::::"":::::::"":::::::"":::
::::"":::::::"":::::::"":::::::"":::::::"))(-(()()((-)))-))#!////(-)(-)(--!--)(()
((-(()(-))))())#;((--)((())((>)((-))((-))))())#!////(-)(-)(--!--)(()((-(((-)<>)))
)())#;((--)((())((>)((-))((-))))())#!////(.)((-)(-'())((-)(((-?))((-?)(-(-)))((!-
(-))(-(-)))))((-)(((-?))((-?)((->(-)))(!-'())(-(-)))((!-(-))(-(-)))))(-(-)))((--)
((--=?<?))((-)(--!#))(--)(-(()())(--)))(()(())((->()))((--))((--))(-)(--)((--(--)
略


今度は /usr/local/bin 内にある、すべての Perl Script を流し込んでやる。

% ( cd /usr/local/bin && \ls -1 | xargs file | grep 'perl script' | sed -e '/:.*/s///' | xargs cat ) | ./symbol_only.scm


実行結果:

#!///#-*--*-#()-,,,.#(@.)##.##;/##;,()#.##,#;#.#.###;.,#,-,,-,.$=$;$=@.*/@@;'.';
('::::');($_)"()..\";;($#!=)":$[-][-][-][-][-]\";$=$[];$=$[];$=$[];$=$_"";#(,$)"
$:'\`$[]':$!\";(<>);@=('');($[]"")$=$[];($[]"")$_=-$[];($[]"")($#==)(,$[]);(,$[]
);(,$[]);($[]"")$_$[]=$[];($[]"")$__$[]=$[];($[]"")$_$[]=$[];($[]"")(<>)@=('');(
$[]"");($[]"")$=-;$=;$="";$=;$=;$=;$=;$=$[];$=;($<=$#)($[$]"")$=$[$+];$+=;($[$]"
")$=$[$+];$+=;($[$]"")$=$[$+];$=$[$+];$=$[$+];$=$[$+];$+=;($[$]"")(,$[$+]);$+=;(
$<=$#&&$[$]";")$++;$++;(!$_&&$!=-)$[$]=$;$_$=;$$=$;$$=$;$$=-$;$__$=-$;$__$=$-$;(
);#$=;(,$)"$:'\`$':$!\";(<>)/^#/;;@=('');$[]"";($[]"")$=$[];($[]"")$=$[];($[]"")
$=$[];();($_)#(,$_)"$:'\`$_':$!\";(<>)/^#/;;@=('');($#==)($[]>=&&$$[])$[$[]]=$[]
;$_$[]=;();#(,$)"$:'\`$':$!\";(<>)/^#/;;@=('');($#==&&$_$[])($$[])"$$[]$[]$[]";(
$[]"")#""#"";"`'";($[]"")"`'";$$[]+=;$$[],$$[]=$[];$$[]+=;$$[]=$[];();$_=$_$_;#(
,">$")"$:'\`$':$!\";();("$\");("$\")$;("\")$_;("%\",$_)$_!=;("%\",($""))$"";($_)
$=$_;$=@.*/@@;("$\");(!$_&&$#>=)("");$(@)("$");("\");($#>=)("\");($=;$<=$#;$++)$
=$[$];$=$[$];($_$==&&$$!=&&$_$==&&$$!=)($=;$<$$;$++)($=;$<$$;$++)($[$]!=)("%%%\"
,$$,$,$$,$,($[$]));#_$_=$""-;#$_=$"";$_=$""$""<$_;$_=$""$""<$_;$_=$""$""<$_;$_=$
""$""<$_;$_-=;($"")$=$"";($"")$=$"";$=;$_=$_*./.;$=($_)/($_);$=$<;("\");($=;$<;$
++)$=$[$];($""&&$"")$$,""="---"$$==;$=;$=$$;$=$<;$=$$;$=$<;$=$>=$_;$+=$>=$_;("%\
%",$$,"",($$));$_=;$__=;$_=;($_)$_=$__$+$_;$_=$_<;$_=$*$*.;$_=$_$_>$_;$__=$__$+$
略


やっぱ、Perl のほうが「うげげ!」度が高い。

ついでに

ついでに、FreeBSDソースコードC言語)も流しこんでみた。

%find /usr/src -name '*.c' | xargs cat | ./symbol_only.scm
/*****("").*.**//.*://..//.**.**,*//..*,,*"[]"*:[][]****$://////.,.....//::$*//*
*..*.*/#<.>#<.>#<.>___*_=;_{__*;__*;*_;_;};/**_().'.*/*_(_,){(==_||==_);(==);*=(
);(==){(!(&_));(_!=)_();();};}/**_().*/*_(_,){(==_||==_);(==);*=(,);(==){(!(&_))
;(_!=)_();();};}/**_().*/_(*,_){();}/**__().*/__(___*){_=;}/**__().*/__*__(*_,_,
_,__*,__*,__*,*_,*,){(==);__*=((__));(==);->=;->=;->_=_;->=;;}/**__().'.*/*__(__
*,){*=(->);(==){(!(&_));(_!=)_();();}(->!=){(->(,->_,)!=){();(!(&_));(_!=)_();()
;}};}/**__().*/__(__*,*){(->!=)->(,->_);();}/**__().*/__(__*){();}/*-*()<@.>*.**
,*,*:*.*,.*.*,*/.**``''*,,,**.*,,,,,*(,,*;,,;)*,,*,()*,*.*/#</.>__("$://///.,...
..//::$");#</.>#</.>#<.>#<.>#<.>#<.>#<.>#<.>__(*,__*,**_){((->,,(->))>=(->)){();
}*_=("");(*_==);();();}___(*_,__,*_,__**){[];*;(__(.,,())==-)();*=((**));(*==)()
;(((*)[].,,((*)[].))>=((*)[].)){(*);();}();}__(*){();}_(__){/*.*/}__(__*){();}_(
,__*){((,,->)==-)();(->[]=='\')();();}___(,**_){*_=("");(*_==)();();}*__(__,*_){
((.));}/*-*()<@.>*.**,*,*:*.*,.*.*,*/.**``''*,,,**.*,,,,,*(,,*;,,;)*,,*,()*,*.*/
#</.>__("$://///.,.....//::$");#</.>#<.>#<.>#<.>#<.>#<.>#<.>#<.>#<.>/*__*/#<.>#_
"#!!!!!!\\"##(_+)_(){*;_;=_(__,,&);(!=){/*.*/_();;}(!=){/*.*/;}/*().*/(,);}/**.,
*''.*/*(*,*){[];_,;*,;(!=)=();(;;){=(,(),);(==)();/*.*/([]=='\'||[]=='#');=();([
略