Мне любопытно: я так понимаю, вы не написали этот fsm? Это для домашнего задания или вы пытаетесь научить себя? Код для FSM выглядит хорошо (на самом деле вполне нормально). Тем не менее, ваша линия запуска:
(fsmtrlst (list 'start (lambda (abc112) (char=? abc112 ))))
Не имеет смысла. Вот почему: fsmtrlst
- это список переходов с конечным автоматом. Это было определено в первом большом блоке кода. Это не вызываемая функция. Я считаю, что функция, которую вы хотите вызвать - run-fsm
. Для этого требуется начальный символ, список переходов, список конечных состояний и входные данные. На самом деле ввод - это не строка, а список. Как следствие, вы можете запустить его со следующей строкой:
(run-fsm 'start fsmtrlst fsmfinal (string->list "abc112"))
Это вызовет run-fsm
с определенным списком переходов fsmtrlst
, определенным списком конечных состояний и готовой к вводу строкой "abc112".
Кстати, все, кроме 'start
, определено как конечное (принимающее) состояние. Однако не все входные данные принимают входные данные. Например, замена "abc122" на "abc (122" не принята.
Это то, что вы хотите?
Обновление:
Ваша редакция прояснила ситуацию. Ваше определение fsmstart
в порядке. Вы пропустили вопросительный знак (?) На одном из ваших char-alphabetic?
употреблений в fsmtrlst
. Есть ли у вас путаница, что вы не знаете, как использовать ваши новые определения? Во-первых, вы должны удалить старые определения fsmtrlst
и fsmfinal
. В противном случае вы, вероятно, получите ошибку определения дубликата. Из вашего нового определения ваша строка для выполнения должна выглядеть следующим образом:
(run-fsm fsmstart fsmtrlst fsmfinal (string->list "w00t"))
Это вернет #t, потому что «w00t» - это символ, за которым следуют два числа, за которыми следует символ.
Я предполагаю, что у вас все еще возникают проблемы с правилами синтаксиса схемы, а не только с логикой вашей конкретной программы. Возможно, вы захотите попробовать более простое упражнение.
ОБНОВЛЕНИЕ 2: не должны ли вы подумать о формулировании нового вопроса?
Ваше последнее обновление нарушило код. Переходная часть fsm работала, потому что переходы были определены как список:
(from-state test-function to-state)
Вы попытались создать переход:
(from-state string-literal to-state)
Вы можете изменить (A, "a", B)
на (A (lambda (x) (string=? x "a") B)
.
Когда вы пытались вызвать вашу функцию, вы взяли функцию, которая ожидала список символов, и дали ей список списка строк. Это не одно и то же. Кроме того, вы заметили, что вы помещаете запятые в свои списки, но они не существуют нигде в коде? Именно из-за этих ошибок я предлагаю вам начать учебник по схеме. Это основные проблемы схемы, не связанные с вашим конкретным упражнением. Я предлагаю вам перемотать свои правки к тому, что было вчера.
К сожалению, я больше не могу обновить этот ответ. Я хотел бы обновить свой ответ, чтобы, если кто-то придет на ваш вопрос с аналогичными проблемами, он увидел полный ответ. Однако вы указали движущуюся цель. Пожалуйста, подумайте о том, чтобы прервать редактирование и отправить новый вопрос, если он у вас есть.