Напишете gem, който интерпретира подмножество на езика Scheme.
- Команда за изпълняване на файл с lisp код.
- Команда за стартиране на интерактивна конзола (подобна на irb/pry).
- Ruby интерфейс за изпълняване на lisp код от низ.
- Придържайте се към духа на езика
- Префиксен синтаксис, много кръгли скоби
- Immutability is king
- First class функции
- Булеви стойности
#tи#fnot,equal?
- Числа
- реални, рационални и цели
+,-,*,/,quotient,remainder,modulo,numerator,denominator- Още 5 по ваш изобор
- Низове
string-length,substring,string-upcase,string-contains?,string->list,string-split(без регулярни изрази)- Още 5 по ваш избор
- Списъци/двойки
null?,cons,null,list,car/cdr/caddr/и т.н. безкрайна дълбочинаmap,foldl,filter,member- Още 5 по ваш избор
- Функции/процедури
lambda,apply,compose- Рекурсия (главен способ за итериране)
- Не забравяйте, че нещата, приличащи на оператори (
+/-/...), са обикновени функции
- Общи
- Литерален синтаксис за различните типове.
define
- Опитайте се да имплементирате истинско подмножество на езика, а не негов диалект. Би следвало да се държи възможно най-близо до реален Scheme. Неща като произволно позиционирани whitespace-и не трябва да объркват интерпретатора.
- Добавете адекватни съобщения при често срещани синтактични грешки (например небалансирани скоби) и при извикване на функция от стандартната библиотека с невалидни аргументи (например
(/ '42' 6)). - Не използвайте
evalи други средства за изпълняване на Ruby код от низ. - Прочетете тази тема от форума.