Напишете gem, който интерпретира подмножество на езика Scheme.
- Команда за изпълняване на файл с lisp код.
- Команда за стартиране на интерактивна конзола (подобна на irb/pry).
- Ruby интерфейс за изпълняване на lisp код от низ.
- Придържайте се към духа на езика
- Префиксен синтаксис, много кръгли скоби
- Immutability is king
- First class функции
- Булеви стойности
#t
и#f
not
,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 код от низ. - Прочетете тази тема от форума.