MUPL编程作业中racketlist->mupllist函数的箭头作用是什么
MUPL作业相关问题解答
函数箭头作用说明
你提到的箭头是指函数名racketlist->mupllist中的->符号,它本身没有特殊的语法效力,属于Racket生态中约定俗成的命名规则,和Racket内置的string->number、list->vector等转换函数的命名逻辑一致:
- 用来直观标记该函数的定位是类型/结构转换函数,箭头左侧是输入值的类型,右侧是输出值的类型
- 放在这个场景下,就直接表明该函数的作用是把输入的Racket原生列表,转换为MUPL语言自定义的列表结构:空的Racket列表对应MUPL的
aunit值,非空Racket列表就用apair逐元素递归封装成MUPL的链表结构。
如果你的疑问是针对cond表达式中的分支写法,补充说明如下:
Racket中cond多分支条件判断的每个分支格式为[判断条件 条件成立时返回的表达式],不存在箭头语法,你看到的只是分支内两个表达式的分隔空格。
参考代码说明
本次作业用到的MUPL结构体定义如下:
(provide (all-defined-out)) ;; so we can put tests in a second file ;; definition of structures for MUPL programs - Do NOT change (struct var (string) #:transparent) ;; a variable, e.g., (var "foo") (struct int (num) #:transparent) ;; a constant number, e.g., (int 17) (struct add (e1 e2) #:transparent) ;; add two expressions (struct ifgreater (e1 e2 e3 e4) #:transparent) ;; if e1 > e2 then e3 else e4 (struct fun (nameopt formal body) #:transparent) ;; a recursive(?) 1-argument function (struct call (funexp actual) #:transparent) ;; function call (struct mlet (var e body) #:transparent) ;; a local binding (let var = e in body) (struct apair (e1 e2) #:transparent) ;; make a new pair (struct fst (e) #:transparent) ;; get first part of a pair (struct snd (e) #:transparent) ;; get second part of a pair (struct aunit () #:transparent) ;; unit value -- good for ending a list (struct isaunit (e) #:transparent) ;; evaluate to 1 if e is unit else 0 ;; a closure is not in "source" programs but /is/ a MUPL value; it is what functions evaluate to (struct closure (env fun) #:transparent)
你咨询的目标转换函数代码如下:
(define (racketlist->mupllist e) (cond [(null? e) (aunit)] [#t (apair (car e) (racketlist->mupllist (cdr e)))]))
内容的提问来源于stack exchange,提问作者Amen
相关产品推荐
相关产品推荐

