Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 替代模型是否需要一个环境_Functional Programming_Scheme - Fatal编程技术网

Functional programming 替代模型是否需要一个环境

Functional programming 替代模型是否需要一个环境,functional-programming,scheme,Functional Programming,Scheme,我正在为这个计划写一个小小的评估器 我需要用替换模型编写计算器,因此没有像set这样的赋值将被使用 但是,由于我仍然需要在某些地方存储基本过程和用户定义变量,我需要一个环境吗?如果是这样,替代模型和环境模型之间的区别是什么 谢谢。是的,您仍然需要一个环境,因为正如您所说,您需要能够存储变量等 替代模型是一种帮助您了解如何评估给定过程的方法。例如,可以定义平方函数 (定义(正方形x)(*x)) 使用替换模型,如果您调用 (square 4) 然后将4替换为函数定义中x的每一次出现,因此 (* 4

我正在为这个计划写一个小小的评估器

我需要用替换模型编写计算器,因此没有像
set这样的赋值将被使用

但是,由于我仍然需要在某些地方存储基本过程和用户定义变量,我需要一个环境吗?如果是这样,替代模型和环境模型之间的区别是什么


谢谢。

是的,您仍然需要一个环境,因为正如您所说,您需要能够存储变量等

替代模型是一种帮助您了解如何评估给定过程的方法。例如,可以定义平方函数

(定义(正方形x)(*x))

使用替换模型,如果您调用

(square 4)
然后将4替换为函数定义中x的每一次出现,因此

(* 4 4) => 16
环境用于可视化变量和状态如何存储在解释器中。简而言之,替换模型用于帮助您评估过程,而环境用于查看解释器如何记住用户在使用解释器时可能定义的变量和定义。

否——对于基于简单替换的评估器,您不需要环境。这是因为一旦有了绑定(例如,当您执行函数调用时),您就会立即用值替换名称,因此无需保留名称->值映射。事实上,您可以通过缓存替换并在以后执行替换来将环境视为避免替换所涉及的开销的一种方法。请参阅遵循此观点的教科书——事实上,它从替换到替换缓存,直到后来才将术语更改为环境

但是请注意使用
set的问题与所有这些无关。当你考虑<代码> SET!<代码>,首先需要明确设置的
级别您正在谈论的:如果它是在您正在实现的语言中,而不是在实现本身中,那么可以在给定任何类型的可变值的情况下添加它——例如,在您可以使用的情况下,这就足够实现
集了在语言中。这通常是在基于环境的计算器中完成的,在该计算器中,环境类型从名称到值的映射更改为名称到位置的映射(实现为框或类似的可变值)。但这并不是真的必要:您仍然可以使用基于替换的求值器来实现这一点,其中这些框正在成为您要替换的值域的一部分。要给出一个具体示例,可以从以下表达式开始(使用类似scheme的语言):

而不是将
1
替换为
x
,您将分配一个包含
1
的框,然后替换相同的框,从而生成

(begin (set! #<box> 2)
       (set! #<box> 3))
(开始(设置)#2)
(套装!#3))
其中,两个
#
e是单个框。(请注意,我说的不是实现代码,而是您正在计算的语言中的表达式。)通常不这样做的原因是它可能会让人困惑——您需要将值表示为可以替换的框,这些框不是源用户程序的一部分,但它们是解释器应该处理的值(例如,最后一个
#
是返回值——但它是您想要返回的值,而不是框),您需要注意框的标识(例如,上述两个框必须是同一个框,才能解释第一个
集合!
在第二个集合中可见)


因此,如果你只是在学习编写口译员,那么不建议这样做。如果是这样,那么我建议你看看那本教科书。

谢谢你的回答。我想问,这两个模型只有在演示如何完成计算时才有用吗?对我来说,它们似乎都在eval/appl中使用y循环。我认为替代模型更多地用于演示计算是如何完成的。环境模型是解释器存储状态的一种方式。例如,过程调用将生成自己的环境,该环境将扩展全局环境并保存自己的变量。感谢您提供的信息。似乎替代模型的“环境”只是一个术语问题。我将阅读PLAI以了解更多信息。不,环境始终是名称(标识符)之间的映射和值。在替代模型中,没有必要这样做,因为值会立即在体内被替换。我在阅读了PLAI和另一本相关的书之后完成了评估,我意识到你是对的。感谢这些详细信息。Whew。。。(我不太喜欢这样的游戏,但它让我感到不安,关于这个问题有错误的问题…)
(begin (set! #<box> 2)
       (set! #<box> 3))