2016-02-28 73 views
2
type VAR = identifier 
    type code = instruction list 
    type environment = identifier list 
    type EXPR = environment -> code * environment 

    fun ADD_OP expr expr' env = DUMMY 
    fun SUB_OP expr expr' env = DUMMY 
    fun MUL_OP expr expr' env = DUMMY 
    fun DIV_OP expr expr' env = DUMMY  
    fun MOD_OP expr expr' env = DUMMY 
    fun NUM n env = ([I_Int n],env) 

我想在這裏寫一個繼續功能。此代碼是用於執行機器指令的較大代碼的一部分。這段代碼的功能是將抽象的語法代碼翻譯成機器碼。下面是該組的機器代碼,這需要兩個操作數從堆棧執行的操作和推壓導致上堆疊爲什麼SML中的下面的繼續功能不起作用?

I_Add 
I_Mod 
I_Sub 
I_Div 

I_Int 

推到堆棧中的整數值的指令的。如果在堆棧中找不到所需的操作數時嘗試執行指令,代碼將發出中止信號。假設你正在執行I_Add,那麼堆棧中必須有兩個操作數,否則它將發出中止信號。

,直到知道,我只設法寫I_Int操作

fun NUM n env = ([I_Int n],env) 

正確的代碼此代碼推整數n壓入堆棧。我知道這裏的策略是先執行「EXPR」和「EXPR'」,然後添加到列表 指令我試着寫的代碼,這在下面的方式

fun ADD_OP expr expr' env = expr env 
           (fn ((c,_),env) => expr' env 
            (fn ((c',_),env) => ((c::c'::[I_Add]),env))) 

但是這導致類型不匹配錯誤

Error: value type in structure doesn't match signature spec 
name: ADD_OP 
spec: ?.EXPR -> ?.EXPR -> ?.EXPR 
actual: ('a -> ('b * 'c -> Machine.Code.instruction list * 'c) -> 'd) 
     -> 'e -> 'a -> 'd 

請有人指出我在正確的方向如何解決這個錯誤。我知道我的方法是對的,但我不理解延續。我試了2天以上,但不能解決這個問題。如果有人知道有關如何在SML中編寫連續文章的任何教程,請幫助。

+1

你能包括'instruction'以及定義是什麼? –

回答

2

我不確定這是否是您的問題,但這不適合發表評論,我無法找到重複(有幾個)。

當您在定義使用它的函數後更改了類型定義時,會發生神祕的「怪異」類型,如。

例子:

- datatype None = A;; 
datatype None = A 
- fun f A = 3;; 
val f = fn : None -> int 
- f A;; 
val it = 3 : int 
- datatype None = A;; 
datatype None = A 
- f A;; 
stdIn:11.1-11.4 Error: operator and operand don't agree [tycon mismatch] 
    operator domain: ?.None 
    operand:   None 
    in expression: 
    f A 
相關問題