2017-02-04 8 views
1

Что я нахожу очень интересным является возможностью Fortrans-й лет обновлений трафарета: вместо зацикливанияКонтрагента обновления трафарета на других языках

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

можно использовать одну гильзу, без явного цикла

v(2:n-1) = 0.5 * (v(1:n-2) + v(3:n)) 

(Для этого и другие примеры см. this slideshow)

У меня нет ничего подобного на любом другом языке программирования. Есть ли другой язык, поддерживающий аналогичный синтаксис?

+0

Что такое «оно» в вашем первом предложении? Фортранский язык? С моей головы MATLAB тоже делает это. – Ross

+0

@ Ross, исправлено, что «это» – marmistrz

+1

Python, Chapel, Julia, каждый может ответить своим любимым языком. Голосование закрывается слишком широко, потому что * «Существует слишком много возможных ответов» * –

ответ

3

Это может быть интересно проверить, вики-страницу для Array programming, который говорит

Современные языки программирования, которые поддерживают программирование массива широко используются в научных и инженерных установок; они включают Fortran 90, Мата, MATLAB, Analytica, TK Solver (как списки), Octave, R, Cilk Plus, Джулия и расширение NumPy на Python ...

, а также страницы для array slicing и a 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.] 

Julia:

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] 

Chapel:

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/РИТ) или вызвать run- (из-за временных массивов), в зависимости от случаев. Поэтому, пожалуйста, позаботьтесь о том, чтобы на самом деле использовать его ...