【问题标题】:How do I let my function return the name of any undeclared variables it accepts as an argument?如何让我的函数返回它接受作为参数的任何未声明变量的名称?
【发布时间】:2019-03-26 22:57:22
【问题描述】:

我希望我的函数返回任何未声明的变量。

例如

fun minus (x, y) = x-y;

如果我得到输入“minus(1, a)”,但没有声明“a”,我希望提升名称“a”。

我应该怎么做?

【问题讨论】:

  • “获取输入”是什么意思?你在实现解释器吗?
  • sml 不使用动态范围。它只能查看绑定在定义位置的变量。
  • @molbdnilo 我认为“获取输入”在这里仅表示参数。
  • 如果您没有实现解释器,SML 将在调用您的函数之前引发错误。函数不是传递名称或变量,而是传递值。

标签: exception sml ml raise


【解决方案1】:

如果a 是一个未声明的绑定,SML 将不会编译这样的程序:

- fun minus (x, y) = x-y;
> val minus = fn : int * int -> int
- minus (1, a);
! Toplevel input:
! minus (1, a);
!           ^
! Unbound value identifier: a

这是一个编译错误,而不是运行时异常。由于缺少值绑定而导致运行时异常是您可以在动态类型语言中实现的,例如Python。正如 molbdnilo 所说,您必须在 SML 中实现解释器才能实现这样的动态行为。例如:

datatype expr = Add of expr * expr
              | Sub of expr * expr
              | Int of int
              | Var of string

exception UnknownVar of string

fun lookup s [] = raise UnknownVar s
  | lookup s ((t,x)::vtable) = if s = t then x else lookup s vtable

fun eval vtable (Add (e1, e2)) = eval vtable e1 + eval vtable e2
  | eval vtable (Sub (e1, e2)) = eval vtable e1 - eval vtable e2
  | eval vtable (Int x) = x
  | eval vtable (Var s) = lookup s vtable

首先运行此解释器以产生有效结果,然后产生错误:

- eval [("foo",3),("bar",2)] (Sub (Var "foo", Var "bar"));
> val it = 1 : int
- eval [("foo",3)] (Sub (Var "foo", Var "bar"));
! Uncaught exception:
! UnknownVar  "bar"

这是一个运行时异常,因为缺少变量。

这里"bar"是一个字符串而不是一个SML标识符。

它只是解释环境中的一个标识符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多