Продолжаю свою эпопею по имплементации r5rs на Java.
D общем-то, все (что реализовано) работает, совпадает с результатами в Guile, Racket и Chicken Scheme.
Беру рандомные примеры с Rosetta Code - в 90% случаев они выполняются правильно, в остальных - нахожу какую-нибудь багу и чиню ее.
Но, периодически возникают различные вопросы по реализации. В Интернете найти вразумительныe ответы не всегда получается.
Вопрос 1:
Как в современных Лиспах/Схемах реализованы списки?
Действительно ли везде берут Cons и из них создают связный список?
Изначально в своей реализации в качестве списков я просто использовал джавовский LinkedList (точнее, наследовал свой класс от него).
Все прекрасно работает, плюс, бесплатно получаю все оптимизации, все полезные методы LinkedList'а, реализацию интерфейсов List, Deque.
Cons же сделал просто отдельным классом, который используется в некоторых случаях, а при любой возможности перехожу на List.
Потом я решил все-таки сделать нормальный Cons и Cons Lists (та еще задача!) - и началось...
Казалось бы, такая простая штука - тупо пара двух значений.
Но потом оказывается, что там много нестандартных специальных случаев, когда эта штука ведет себя немного по-другому (nil-terminated lists, dotted notation, cyclic lists etc. NIL объект должен быть синглтоном. Плюс, так как это Джава, то нельзя использовать рекурсию, все приходится переделывать в итеративную версию)
В итоге, я, конечно, реализовал Cons-ячейку и списки из них, но, как мне кажется, больше потерял, чем приобрел.
Во-первых, непонятно как связать уже готовый класс, который наследует от LinkedList и новый Cons.
Во-вторых, теряются все полезные свойства стандартных джавовских коллекций.
Так вот, действительно ли сейчас реализовывают списки через кучу связанных Cons cells?
Есть ли какой-нибудь красивый и простой способ остаться на стандартных джавовских коллекциях, реализовать и список, и cons-ячейку, да еще и сделать, чтобы список был реализован непосредственно через cons'ы, либо наследовал от них?
Вопрос 2:
Есть ли какой-то стандартных набор юнит тестов/кейсов на которых можно было бы тестировать свою имплементацию?
Т.е. если все эти тесты пройдены, то имплементация считается успешной.
Я, конечно, стараюсь покрывать все возможные случаи, плюс, проверяю на примерах из Интернетов (той же Rosetta Code), но в спецификации же полно редких случаев и тп.
Ответ на:
комментарий
от monk
Ответ на:
комментарий
от kovrik
Ответ на:
комментарий
от monk
Ответ на:
комментарий
от no-such-file
Ответ на:
комментарий
от monk
Ответ на:
комментарий
от kovrik
Ответ на:
комментарий
от lovesan
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Вопрос по quasiquote и unquote-splicing (2016)
- Форум [Scheme]и снова выбираем реализацию (2008)
- Форум Пара вопросов по PLT-Scheme (2009)
- Форум Пара вопросов по реализации интерфейса (2012)
- Форум Scheme (2011)
- Форум Scheme (2005)
- Форум Scheme (2006)
- Форум Открыты исходные коды коммерческой реализации Chez Scheme стандарта R6RS (2016)
- Форум Scheme, идентификаторы (2012)
- Форум Императивность Scheme (2013)