Сейчас, я думаю, что в состоянии быстро объяснить его концепции, но когда-то, после 10 лет на C++, я его тоже довольно плохо воспринимал. По сути, необычно в нём:
- любая программа должна восприниматься как текст на естественном языке (отсюда синтаксическая избыточность)
- всё является объектом, включая любой код - он является экземпляром Proc
- конструкция do..end или {} - не операторный блок, а блок в понимании хранимого объекта, который когда-нибудь будет вызван (или не вызван)
- любая конструкция, которая содержит do…end - это метод, который активируется с блоком. Включая if … end, while…end и пр. По их модели, скорее следует воспринимать как if() do … end, while() do…end
- код, написанный где угодно - это всего лишь код, который будет исполнен. Потому class Abc…end, def abc …. end для него тоже - методы с блоком