いけむランド

はてダからやってきました

ゆの in Fortran95

またまたタイミング遅れなせいで大方の言語は出尽くした感があったんだけど、まだ誰もやってない言語があったので、やってみた。

!
! 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 特有の話かもしれない。