A fun, but ultimately pointless exercise from the “Python
for Fortran Programmers” thread in news:comp.lang.fortran:
Try to write the following Fortran 77 program (note the
6 space indentation) in Ruby so that it looks as close
to the Fortran as possible without extending Ruby:
program ii
integer i
do i=0,10
print*,i
if (i.gt.5) goto 1
enddo
1 print*,i*i
end
Here’s the Python candidate to date:
for i in range(10): #begin
print i
if i>5: break #end
print i*i
May an alternative solution which extends Ruby with
a mini Fortran DSL would also be interesting?
Your Fortran program is not legal since the value of i outside the loop
is not defined. Over the years, I have seen are 6, 7 and runtime error
(although you are not likely to see the latter with slack modern
workstation compilers) as a value.
I would suggest putting the print of i*i inside a block if.
A bad guess. Swap the prints for putses like this:
puts *i
…
1; puts ii
Any ideas for making “then break end” look more like “goto 1”?
Cheers,
Dave
harp:~ > cat a.f
program ii
integer i
do i=0,10
print*,i
if (i.gt.5) goto 1
enddo
1 print*,i*i
end
harp:~ > f77 a.f && a.out
0
1
2
3
4
5
6
36
harp:~ > cat a.rb
i = catch('1') do
(0..10).each do |i|
puts i
throw '1', i if i > 5
end
end
puts i * i
harp:~ > ruby a.rb
0
1
2
3
4
5
6
36
First of all there is no programming language calles “Fortran 77”. The
correct name is “FORTRAN 77”. The spelling “Fortran” is used for more
recent versions like “Fortran 90”. Next the above program is no valid
FORTRAN 77. If a compiler sticks to the FORTRAN 77 specification it
will issue a syntax error because “enddo” is unknown to it. FORTRAN 77
do-loops start with the DO keyword followed by a label. The label
names the line that marks the end of the loop. The labelled statement must be an executable one. People tend to use “continue” for this
purpose.
program ii
integer i
do 1 i=0,10
print*,i
if (i.gt.5) goto 2
1 continue
2 print*,i*i
end
If your compiler supports “end do” (which is no F77) it may as well
support “exit” (which isn’t either) so that you can write:
program ii
integer i
do i=0,10
print*,i
if (i.gt.5) exit
end do
print*,i*i
end
Besides that all variables starting with an ‘i’ are already integers
so that you can write
program ii
do i=0,10
print*,i
if (i.gt.5) exit
end do
print*,i*i
end
Nevertheless I prefer Fortran 90+ and write
program ii
do i=0,10
print*,i
if (i>5) exit
end do
print*,i*i
end
You may need to provide the command line option “-free” or similar :->
I learned FORTRAN 77 on an IBM Mainframe using a terminal that had a
“Mixed case display/Uppercase only display” switch
Josef ‘Jupp’ Schugt
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.