Первая проблема вызвана лишней парой скобок. Имейте в виду, что в Racket, Typed Racket и #lang pl
круглые скобки обычно означают применение функции следующим образом:
(function argument ...)
Поэтому, когда вы пишете (code)
, он пытается интерпретировать code
как функцию, вызывая ее с нулевыми аргументами.
Эту проблему можно исправить, заменив (code)
на code
в теле функции parse
.
(define (parse str)
(let ([code (string->sexpr str)])
(parse-sexpr code)))
Вторая проблема возникает из-за того, что вы указали, что функция parse
должна возвращать PLANG
, но вместо этого она возвращает результат parse-sexpr
, который возвращает AE
.
Еще один способ выразить это в том, что вы реализовали разбор для AE
с, но не для PLANG
с.