#interpreter #sml
#интерпретатор #sml
Вопрос:
Я пишу интерпретатор на стандартном ML, но у меня проблемы с синтаксисом в этой функции, и я не могу понять, что не так.
Вот соответствующий код:
| eval (rho, SetExp (name, value)) =
(case rhoContains rho name of
true => rhoSet rho name value (rho, value)
| false => globalSet (name, value))
fun rhoSet [] key value = [(key, value)]
| rhoSet ((elt as (k, v)) :: tail) key value =
if key = k then (key, value) :: tail else elt :: rhoSet tail key value
fun rhoContains rho name =
case rhoGet rho name of SOME _ => true | NONE => false
Вот откуда берется SetExp:
datatype expression =
SetExp of (string * expression)
Запуск этого дает мне длинный список ошибок, но я думаю, что это соответствующий раздел. Строка 62 — это строка, начинающаяся с true
in eval
:
eval.sml:62: error: Type error in function application.
Function: rhoSet rho name value : (string * expression) list
Argument: (rho, value) : (string * expression) list * expression
Reason: Value being applied does not have a function type
Ответ №1:
Вы передаете слишком много аргументов для rhoSet
удаления завершающей пары.
| eval (rho, SetExp (name, value)) =
(case rhoContains rho name of
true => rhoSet rho name value
| false => globalSet (name, value))
Вы также можете сделать это более читаемым с помощью условного:
| eval (rho, SetExp (name, value)) =
if rhoContains rho name
then rhoSet rho name value
else globalSet (name, value)
Ответ №2:
Для SML в выражении rhoSet rho name value (rho, value)
rhoSet rho name value
является функцией и (rho, value)
является аргументом этой функции. Однако, по определению rhoSet
, rhoSet rho name value
обязательно является списком, а не функцией. Вот что означает сообщение об ошибке.