我正在学习惰性函数式语言评估并遇到了 STG 机器。为了理解它,我正在为功能语言(STG)构建一个小型玩具编译器。
然而,有一件事我无法真正理解:根据 1992 年的论文,stg 表达式可以是:let
绑定、case
表达式、应用程序、构造函数、内置操作或未装箱的文字。
因此,如果我有一个只使用变量而不调用它的程序,它仍然必须编译为应用程序,因为 stg 表达式变体中没有“var”选项(本文第 20 页)。例如:
id x = x
编译为
id = {} \ {x} -> x {} # application with no arguments
但是,如果这个id
函数需要一个原始值呢?( id :: Int# -> Int#
) 它无法编译为应用程序,因为您无法“输入”原始值,但没有其他选择吗?
非常感谢
(编辑:链接到我所指的论文)