在方案中的新行中打印每个数字

Printing each number in new line in Scheme

我需要帮助将此 Pascal 代码转换为 Scheme 代码:

program reverseorder;
type
arraytype = array [1..5] of integer;

var
arr:arraytype;
i:integer;

begin

for i:=1 to 5 do
    arr[i]:=i;

for i:=5 downto 1 do
    writeln(arr[i]);
    
end.

我想访问一个特定的原子,它似乎在 Scheme 中没有迭代方法。

有很多方法可以解决这个问题。使用您正在使用的在线解释器,您将仅限于香草方案,并且解决方案将比需要的更冗长,使用递归:

(define lst '(1 2 3 4 5))

(let loop ((rev (reverse lst)))
  (when (not (null? rev))
    (display (car rev))
    (newline)
    (loop (cdr rev))))

使用针对初学者的 Racket,您可以编写一个更简单(尽管非标准)的解决方案:

(define lst (range 1 6))

(for ([e (reverse lst)])
  (displayln e))

无论哪种方式,请注意,反转列表的过程已经内置在该语言中,您不需要重新实现它 - 自然地,它被称为 reverse。如果不是很明显,在 Scheme 中我们更喜欢使用 lists,而不是数组来表示元素序列——建议停止考虑索引、数组长度等. 因为这不是 Scheme 中的处理方式。

如果您不关心返回值(它是 #<undef>)而只想产生输出,您可以使用 for-each:

(for-each print (reverse (list 1 2 3 4 5)))

Output:
5
4
3
2
1

不是惯用的 Scheme,而是 Pascal 代码的直译:

(let ([arr (make-vector 5)])
     (do ([i 0 (+ i 1)]) ((= i 5)) (vector-set! arr i i))
     (do ([i 4 (- i 1)]) ((negative? i))
         (display (vector-ref arr i))
         (newline)))