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
酒神バッカス
画像は本文と関係ありません。
前半だけですが・・・