またまたタイミング遅れなせいで大方の言語は出尽くした感があったんだけど、まだ誰もやってない言語があったので、やってみた。
! ! X / _ / X < :来週も見てくださいね! ! module yuno logical :: X = .true. interface operator(/) module procedure f1, f2 end interface interface operator(<) module procedure f3 end interface contains logical function f1(a, b) logical, intent(in) :: a, b f1 = .true. end function logical function f2(a, b) logical, intent(in) :: a character(*), intent(in) :: b f2 = .true. end function logical function f3(a, b) logical, intent(in) :: a character(*), intent(in) :: b write(*,*) "ひだまりスケッチ×365 ", b f3 = .true. end function end module program main use yuno X = & X / '_' / X < "来週も見てくださいね!" end
% gfortran -v Using built-in specs. Target: i686-pc-cygwin コンフィグオプション: ../gcc44/configure --prefix=/usr/local/gfortran --enable-languages=c,fortran --disable-bootstrap --enable-threads=posix --enable-sjlj-exceptions --enable-version-specific-runtime-libs --enable-nls --disable-libmudflap --disable-shared --disable-win32-registry --with-system-zlib --enable-checking=release --enable-werror --without-included-gettext --without-x --enable-libgomp スレッドモデル: posix gcc version 4.4.0 20080517 (experimental) [trunk revision 135459] (GCC) % gfortran yuno.f95 % ./a.exe ひだまりスケッチ×365 来週も見てくださいね! %
こうですか?わかりません。><
(99.99% の人は知っておかなくても生活に全然問題ない) 苦労した点について、まとめておく。*1
- 識別子の先頭に _ は使えない仕様らしい (仕方なく単一引用符で文字化)。: もどうしようも思いつかなかったので削除。日本語も文字列化。
- _ の文字化のせいで利用者定義演算子 / が 2 つ ((logical, logical) と (logical, character(*))) 必要になった。_ を使わずに別の文字にすれば、変数にできるため、利用者定義演算子 / は前者 1 つのみでできると思われる。
logical :: Y = .true. X = & X / Y / X < "来週も見てくださいね!"
- 利用者定義演算子は多重定義はできるけど、再定義はできないらしい。つまり / とか < は両辺に integer を置いたら、普通に除算とか小なりを演算するため、その挙動を変更することはできないけど、logical とか character(*) に対する演算は元々定義されていないため、interface operator で多重定義することができるみたい。
*1:もしかしたら gfortran 特有の話かもしれない。