用其他语言更新模板的对应部分

时间:2017-02-04 18:39:56

标签: fortran programming-languages

我觉得真正有趣的是Fortrans的模板更新能力:而不是循环

.button-infousuario{
   width: 100%;
   text-align: left;
}

可以使用单行,没有显式循环

t2 = v(1)
do i=2, n-1
    t1   = v(i)
    v(i) = 0.5 * (t2 + v(i+1))
    t2   = t1
enddo

(为此,其他示例见this slideshow

我在任何其他编程语言中都没有类似的东西。有没有其他语言支持类似的语法?

1 个答案:

答案 0 :(得分:3)

查看Array programming的维基页面可能会很有趣,其中包含

  

支持阵列编程的现代编程语言常用于科学和工程设置;这些包括Fortran 90,Mata,MATLAB,Analytica,TK Solver(作为列表),Octave,R,Cilk Plus,Julia以及Python的NumPy扩展......

以及array slicinga list of array languages的网页。所以,几种语言似乎有类似的语法(可以追溯到ALGOL68的旧版本?!)

以下是一些示例(可能存在错误,请自行检查..):

Fortran:

program main
    implicit none
    real, allocatable :: v(:)
    integer i, n

    n = 8
    v = [( real(i)**2, i=1,n )]
    print *, "v = ", v

    v(2:n-1) = 0.5 * ( v(1:n-2) + v(3:n) )
    print *, "v = ", v
end

$ gfortran test.f90 && ./a.out
 v =    1.00000000       4.00000000       9.00000000       16.0000000       25.0000000       36.0000000       49.0000000       64.0000000    
 v =    1.00000000       5.00000000       10.0000000       17.0000000       26.0000000       37.0000000       50.0000000       64.0000000 

的Python:

import numpy as np

n = 8
v = np.array( [ float(i+1)**2 for i in range( n ) ] )
print( "v = ", v )

v[1:n-1] = 0.5 * ( v[0:n-2] + v[2:n] )
print( "v = ", v )

$ python3 test.py 
v =  [  1.   4.   9.  16.  25.  36.  49.  64.]
v =  [  1.   5.  10.  17.  26.  37.  50.  64.]

朱莉娅:

n = 8
v = Float64[ i^2 for i = 1 : n ]
println( "v = ", v )

v[2:n-1] = 0.5 * ( v[1:n-2] + v[3:n] )
println( "v = ", v )

$ julia test.jl
v = [1.0,4.0,9.0,16.0,25.0,36.0,49.0,64.0]
v = [1.0,5.0,10.0,17.0,26.0,37.0,50.0,64.0]

礼拜堂:

var n = 8;
var v = ( for i in 1..n do (i:real)**2 );
writeln( "v = ", v );

var vtmp = 0.5 * ( v[1..n-2] + v[3..n] );
v[2..n-1] = vtmp;
writeln( "v = ", v );

$ chpl test.chpl && ./a.out
v = 1.0 4.0 9.0 16.0 25.0 36.0 49.0 64.0
v = 1.0 5.0 10.0 17.0 26.0 37.0 50.0 64.0

(请参阅其他语言的维基页面等)。

我认为:..这样的数组符号非常方便,但它可以给出意想不到的结果(如果使用不当,例如索引的含义,或LHS的可能重叠) / RHS)或导致运行时开销(因为临时数组),具体取决于具体情况。所以请在实际使用时注意......