Определить функцию схемы для инфикса - PullRequest
0 голосов
/ 11 сентября 2018

Как определить схему функции для инфикс-калькулятора?

Например, когда я ввожу (infix '(2 + 3)), он должен оценивать 5

Если я введу (infix '(7 - 3), это должно оценить 4

1 Ответ

0 голосов
/ 23 сентября 2018

Это может стать действительно сложным довольно быстро. Рассмотрим (1 - 2 * 3). Если ваш калькулятор поддерживает только сложение и отрицание, это все еще не тривиально. Рассмотрим (5 - 5 - 5). Если вы считаете входные данные левоассоциативными, вы получите правильный -5, но если вы прочитаете их как правые ассоциативные (что является обычной ошибкой, если вы анализируете выражение с помощью некоторого парсера LL), вы получите 0.

Для правильного преобразования из инфикса в префикс (именно так вы будете вычислять свой результат в Схеме) обычно вам нужно проанализировать весь ввод в дерево разбора, и как только это будет сделано правильно, остальное на самом деле, тривиально (узлы дерева - это операции, а листья - числа).

Если вы поддерживаете только выражения двух операндов, это просто, просто используйте cadr, чтобы узнать, какой оператор вы получили, и примените (возможно, используя eval [1] ) эту операцию к операнды


[1] Если вы используете eval, обратите внимание на комментарий Алекса Кнаута ниже.

...