Как я могу остановить чтение ввода, когда вводится определенный символ?
Я пытаюсь реализовать мою собственную функцию вычитания в схеме. Я должен использовать метод apply, чтобы применить вычитание к вводу пользователя. Дело в том, что пользовательский ввод должен быть между (), [] или {} (я пишу небольшой переводчик для небольшого языка). У меня уже есть код, управляющий открывающей скобкой, но моя проблема заключается в использовании метода apply для остальных. Мне нужно прочитать только данные, введенные перед закрывающей скобкой. Есть ли способ прочитать ввод и остановиться на разделителе ")", "]" или "{}". Даже если вы сможете направить меня в нужном направлении только на один разделитель, я смогу заставить остальное работать.
Вот что я пытаюсь сделать:
(define subt (lambda (x)
(apply - (read-line))))
Но я хочу, чтобы он прекратил читать на закрывающей скобке.
2 ответа
read
Процедура читает схемы формы между #\(
а также #\)
, Предполагая, что парены являются подходящим разделителем следующих работ:
(define subt
(lambda (x)
(apply - (read))))
Конечно, -
ожидает цифры и read
вернет любую форму Схемы.
> (subt 'ignore)
(10 5 3 1)
1
Всякий раз, когда вы найдете открывающую скобку, добавьте ее в стек и начните добавлять символы, которые вы читаете по пути, в структуру данных, например, в новый список или синтаксическое дерево (обратите внимание: вы должны читать символ за символом, строка за строкой как подразумевается в вашем коде!). Всякий раз, когда вы найдете закрывающую скобку, соответствующую верхнему элементу в стеке, вытолкните верхнюю скобку из стека и прекратите добавлять элементы в список символов - в этот момент вы знаете, что в используемой структуре данных прочитано полное выражение и может продолжить свою оценку.
Кроме того, вы должны отделить код для анализа входных данных от кода для его оценки таким образом, чтобы оценщик получил список, синтаксическое дерево или любое другое промежуточное представление, возвращаемое синтаксическим анализатором, и ему не приходилось беспокоиться о чтении символов. поиск подходящих скобок и т. д.
РЕДАКТИРОВАТЬ
Если вам не нужно реализовывать синтаксический анализатор с нуля, подойдет простое решение, включающее встроенные процедуры, как предлагает @GoZoner: используйте read
Процедура проверки ввода номеров между ()
и завершение ввода возвращением, например так:
(define (subt)
(apply - (read)))
(subt)
input: (10 2 1)
output: 7