首页 > 其他分享 >CS61A_lab14_macro

CS61A_lab14_macro

时间:2023-04-21 21:59:18浏览次数:43  
标签:case macro CS61A lab14 cond expr cases 表达式 分支

 

(define-macro (switch expr cases)
  (cons 'cond
    (map (lambda (case) (cons (eq? (eval expr) (car case))  (cdr case)))
            cases))
)

 

这段代码是一个用于 Scheme 语言的宏定义,可以将一系列的条件分支语句转化为 Scheme 的 cond 表达式。

下面是具体的解释:

1. `(define-macro (switch expr cases) ...)`:定义一个名为 switch 的宏,宏的参数为 expr 和 cases。

2. `(cons 'cond ...)`:使用 Scheme 的 cons 函数将一个符号 'cond 和接下来的参数拼接在一起,以生成一个 cond 表达式。

3. `(map (lambda (case) (cons (eq? (eval expr) (car case)) (cdr case))) cases)`:使用 map 函数遍历 cases 中的每个分支,将其转化为一个 (condition . expression) 对,其中 condition 为一个布尔值,用于判断当前的表达式是否符合该分支的条件,而 expression 则为当前分支的表达式。

4. `(eq? (eval expr) (car case))`:eval 函数会求解表达式,将其结果返回。这里将 expr 作为参数传递给 eval 函数,以获取它的值。然后将其与当前分支的第一个元素(即该分支的条件)比较,以判断当前表达式是否符合该分支的条件。

5. `(cdr case)`:取出当前分支的第二个元素,即该分支的表达式,作为返回值。

最终,这个宏将根据传入的 expr 和 cases 参数生成一个 Scheme 的 cond 表达式,将 expr 的值与每个分支的条件进行比较,并执行符合条件的分支的表达式。

 

(eval expr) 是一个 Scheme 内置函数,用于求解并执行 Scheme 代码中的表达式 expr。它接收一个 Scheme 表达式作为参数,将其求值并返回结果。在这个宏定义中,我们使用 (eval expr) 来获取 switch 宏的第一个参数 expr 的值,从而对其进行条件判断,并执行符合条件的分支的表达式。

(switch x
  ((1) 'one)
  ((2) 'two)
  ((3) 'three)
  (else 'other))

;宏替换之后

(cond ((eq? x 1) 'one)
      ((eq? x 2) 'two)
      ((eq? x 3) 'three)
      (else 'other))

 如果前面有[ ` ] 才需要用逗号进行插值

标签:case,macro,CS61A,lab14,cond,expr,cases,表达式,分支
From: https://www.cnblogs.com/xuenima/p/17341907.html

相关文章

  • CS61A_lab12_macro
     (define-macro(deffuncargsbody)`(define,(consfuncargs),body))分析:定义一个万能的函数定义,那就要模拟函数定义的样子。ok,函数定义是什么样子的呢?eg:(define(filter-lstfnlst)(if(null?lst)nil(if(fn(carlst))(cons(carlst)(fi......
  • CS61A_hw07
     #langsicp(define(uniques)(if(null?s)nil(cons(cars)(unique(filter(lambfa(x)(not(eq?x(cars))))(cdrs))))))这是一个Scheme函数,名......
  • stata 显示所有macro
    .macrolistzong:a421a422S_level:95F1:helpadvice;F2:describe;F7:saveF8:useS_ADO:BASE;SITE;.;PERSONAL;PLUS;OLDPLACES_StataMP:MPS_StataSE:SES_OS:......
  • C-宏 (macro)
    定义宏(definemacro)>宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式.>>解释器或编译器在遇到宏时会自动进行这一模式替换.对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器.#define宏名(记号)内容定义和使用#define......
  • CS61A_lab08
    题目:Writethegeneratorfunction make_generators_generator,whichtakesazero-argumentgeneratorfunction g andreturnsageneratorthatyieldsgenerators.Foreachelement e yieldedbythegeneratorobjectreturnedbycalling g,anewgeneratorobjec......
  • glib gmacros.h
    /*GLIB-LibraryofusefulroutinesforCprogramming*Copyright(C)1995-1997PeterMattis,SpencerKimballandJoshMacDonald**Thislibraryisfreesoftware;youcanredistributeitand/or*modifyitunderthetermsoftheGNULesserGeneral......
  • CS61A_lab_07
    Problem2题目描述:代码:1definc_subseqs(s):2"""AssumingthatSisalist,returnanestedlistofallsubsequences3ofS(alistoflists)forwhichtheelementsofthesubsequence4arestrictlynondecreasing.Thesubseq......
  • CS61A_HW04
    Q6题目描述:Writeafunction has_path thattakesinatree t andastring phrase.Itreturns True ifthereisapaththatstartsfromtherootwherethe......
  • flask-宏的用法macro
    宏---类似函数macro-demo.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>宏定制</title></head><body><h3>JinJa模板宏用法:(......
  • cpp redifinition issues resolved by add macro #pragma once
    1.Without#pragmaonce  2.Whencomplement#pragmaonce,compileworked ......