fortran66のブログ

fortran について書きます。

ACM Fortran Forum の最新号の記事に面白いものがありました。

"Note on array-valued functions" by Arjen Markus
http://portal.acm.org/citation.cfm?id=1373277.1373278&coll=portal&dl=ACM&idx=J286&part=newsletter&WantType=Newsletters&title=ACM%20SIGPLAN%20Fortran%20Forum&CFID=29637889&CFTOKEN=83420960

この中で最近はやりの関数型プログラミング言語っぽい quick-sort プログラムが紹介されていました。

実行結果:

MODULE m_sort
IMPLICIT NONE
CONTAINS
RECURSIVE FUNCTION qsort_reals( dat ) RESULT( sorted )
IMPLICIT NONE
REAL, INTENT(IN) :: dat(:)
REAL :: sorted( SIZE(dat) )
IF ( SIZE(dat) > 1 ) THEN
 sorted = (/ qsort_reals(  PACK( dat(2:), dat(2:) >  dat(1) )  ), &
             dat(1),                                              &
             qsort_reals(  PACK( dat(2:), dat(2:) <= dat(1) )  )  /)
ELSE
 sorted = dat
END IF
RETURN
END FUNCTION qsort_reals
END MODULE m_sort
!===============================================================
PROGRAM func
USE m_sort
IMPLICIT NONE
REAL :: a(100)
CALL RANDOM_NUMBER(a)
PRINT *, qsort_reals(a)
STOP
END PROGRAM func

この Quick-sort プログラムは、よく Haskell で自慢げに書かれるプログラムに対応しています。

qsort []     = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
                 where
                   elts_lt_x   = [y | y <- xs, y < x]
                   elts_greq_x = [y | y <- xs, y >= x]


ところで関数型言語に関しては Fortran の創始者J・バッカスが最初期に重要な関与をしています。

http://www.stanford.edu/class/cs242/readings/backus.pdf

酒神バッカス

画像は本文と関係ありません。


前半だけですが・・・