Я пишу схему в интерпретаторе. Кажется естественным, что интерпретатор, подобный Схеме, должен хорошо работать с любым объектом, который реализует IEnumerable.Каков минимальный набор «примитивов» последовательности, необходимый для любых вычислений последовательности?
Интерпретатор не допускает мутации - функции с побочными эффектами не отображаются.
Поскольку IEnumerable не является клонированным, (см. here), я не могу эффективно реализовать итерацию по списку с помощью автомобиля и cdr.
Для того, чтобы любой материал более высокого порядка был эффективным, мне пришлось реализовать некоторые примитивы как встроенные C# для интерпретатора.
До сих пор я реализовал следующие "примитивов", как C# встроенных функций:
- фильтра
- карта (полная карта, а не только MAPCAR)
- foldr
Но Я подозреваю, например, что я мог бы реализовать «фильтр», используя комбинацию карты и foldr.
Каков минимальный набор примитивов, которые мне нужно будет выставлять как «встроенные», чтобы я мог реализовать любую другую функциональность над экземплярами IEnumerable без лишних затрат времени выполнения или пространства и не вводить мутацию?
Просто наблюдения. Я тоже использовал IEnumerable для списков, но, как только вам нужны неправильные списки, все дело падает. Мне было лучше просто создать класс Cons и использовать его так, как он используется в Scheme. Это не говорит о том, что ваши минусы не могут быть IEnumerable, просто не полагайтесь на то, что это правильный список. – leppie
Перечислимый может быть «клонирован» быстро. Просто используйте select и pass в функции идентификации для селектора. – leppie