REBOL - гомоиконический язык. Тип данных block!
в REBOL представляет собой набор квадратных скобок, внутри которых находятся любые допустимые токены REBOL, аналогично S-выражению в Lisp. Например:
series: [1 2 3 4]
foreach item series [
print item
]
Теперь, давайте выразим это немного по-другому:
series: [1 2 3 4]
for-body: [print item] ; This is the body of our foreach
foreach item series for-body
Хотя он был объявлен как данные, мы обрабатывали блок for-body
как код, когда передавали его в функцию foreach
. Если мы спросим REBOL, каков тип первого элемента в блоке for-body
- type? first for-body
- он сообщит нам word!
, а не function!
(или native!
или action!
или любой другой REBOL типы функций). Причина в том, что в качестве данных for-body
- это просто неоцененный кусок слов REBOL. Когда мы передаем его в foreach
только тогда, он оценивается как код.
Некоторые называют REBOL «как Лисп, но без скобок», и я лично предпочитаю это Лиспу, но вы не можете. Тем не менее, это отличный язык для начала, когда вы хотите узнать о гомойконичности, предмет, который я нахожу захватывающим.