rebol/red: есть ли элегантный способ узнать, является ли это последним элементом в foreach?

Мой код неуклюжий:

  length: length? items
  count: 0
  foreach item items [
     count: count + 1
     if count = length [
        print "last item"
     ]
  ]

Есть что-то лучше?


person user310291    schedule 26.10.2017    source источник


Ответы (1)


Обычно люди используют FORALL (который лучше бы назвал FOR-NEXT), который перемещает позицию в ряду, а не дает элемент, тогда вы можете проверить его с помощью TAIL?. Недостатком является то, что вам нужно выбрать элемент из серии в текущей позиции:

forall items [
    probe items/1 ;-- how to access current item
    if tail? next items [ ;-- could use LAST? ITEMS in Rebol 3
        print "last item"
    ]
]

Это примерно эквивалентно:

 if not tail? items [
     original: items
     until [
         probe items/1
         if tail? next items [
             print "last item"
         ]
         items: next items
         tail? items
     ]
     items: original
 ]

Предупреждаем: FORALL видоизменяет свой входной ряд и пытается вернуть его в исходное положение в конце. Но у него плохо определенное поведение в случае возникновения ошибок, поэтому вы можете оставить свой ввод в середине итерации, если возникнет проблема.

person HostileFork says dont trust SE    schedule 26.10.2017
comment
Это не работает. Ни Rebol2, ни Red не могут напечатать последний элемент, так как цикл останавливается в хвосте перед оператором печати. Вы должны проверить следующую позицию tail? следующие элементы - person sqlab; 27.10.2017
comment
@sqlab Спасибо, исправлено. Обратите также внимание, что у R3-Alpha есть LAST? что могло бы быть хорошо и для Реда. - person HostileFork says dont trust SE; 27.10.2017