То, что ваше назначение называет «символами», на самом деле является символами с именем длины 1. Кажется, что вы можете просто мысленно заменить слово «символы» на «символы» и работать с этим.
Атом - это все, что не является минусом - любой непустой список состоит из цепочки конусов. Например, символы, числа, строки и nil
являются атомами.
Минусы (на самом деле минусы) - это простая структура данных, которая может содержать две вещи. В списке первое, что есть у каждого минуса, это какой-то элемент списка, а второй - указатель на следующий минус или ноль. Вы также можете иметь списки в качестве элементов списка; тогда также первым делом будет указатель на список. Тогда это будет формально дерево. Функция доступа для первой вещи «против» называется car
или first
, функция доступа для другой вещи называется cdr
или rest
. Car
и cdr
немного архаичны, и в основном используются, когда вы видите cons-ячейку как узел дерева, в то время как first
и rest
более современные, и в основном используются, когда вы видите cons-ячейку как список звено цепи.
Вы можете проверить, является ли вещь атомом, с помощью функции atom
. Если это не атом, это список по крайней мере с одним элементом.
Ваше задание состоит из нескольких частей:
- Пройдите по дереву, чтобы посмотреть на каждый элемент. Это может быть сделано с помощью рекурсии или с помощью цикла в одном направлении и рекурсии в другом.
- Храните список символов, которые вы уже нашли.
- Если элемент, на который вы смотрите, является символом (с именем длиной 1…), то проверьте, является ли он новым, если да, добавьте его в свой список.
- Наконец, верните этот список.
Одна полезная идиома - использовать push
или pushnew
, которые ставят новые элементы в начало списка, а в конце reverse
it.