端午在家休息了好几天,基本上就是带孩子和睡觉了。荒废了好几天之后,今天重操旧业。
The Little Scheme看到第99页了。要写一个函数numbered?来判断一个表达式是否是数字表达式。
上代码:
(define atom?
(lambda (a)
(not (or (null? a) (pair? a)))))
(define operator?
(lambda (op)
(or (eq? (quote +) op) (eq? (quote -) op) (eq? (quote *) op) (eq? (quote /) op))))
(define numbered?
(lambda (lat)
(cond
((atom? lat) (number? lat))
((null? lat) #f)
((null? (cdr lat)) #f)
((null? (cdr (cdr lat))) #f)
(else (and (numbered? (car lat)) (operator? (car (cdr lat))) (numbered? (car (cdr (cdr lat)))))))))
然后我自己写了一系列的测试用例来测试上面的函数。但是,慢慢的觉得这样太麻烦了。开始萌生自己写个测试工具的想法:我提供测试用例,工具来把参数传给被测试的函数,再把得到结果与预期结果相比较。这有点像JUnit中的AssertEqual。
时间不长写出来了,名字就叫testN吧。
上代码:
(define testN
(lambda (func test-cases)
(cond
((null? test-cases) '())
(else (map (lambda (it)
(eq? (apply func (list (car it))) (car (cdr it)))) test-cases)))))
那来测一下之前写的函数numbered?
(testN numbered? '(
(1 #t)
('a #f)
(() #f)
((1) #f)
((1 2) #f)
((1 'a) #f)
((1 + 2) #t)
((1 + (1 + 2)) #t)
((1 + (1 2)) #f)
(((1 + 2) + (1 + 9)) #t)
(((1 2) + (1 + 2)) #f)
))
结果是:
'(#t #t #t #t #t #t #t #t #t #t #t)
哈哈,通过了。
分享到:
相关推荐
Scheme-Lib为Android开发者提供了一个独特的工具,允许他们在应用程序中利用Scheme的强大功能。它不仅可以帮助简化某些任务,还可以提高代码的可读性和可维护性。尽管目前主要针对Android,未来可能的多平台支持将使...
在移动应用开发中,"scheme"是一种常见的机制,用于实现应用程序间的交互,即从一个应用启动另一个应用。本文将深入探讨scheme如何实现唤醒外部APP,以及它在Webview和浏览器环境中的应用。 首先,理解scheme的基本...
首先,我们需要在Info.plist文件中添加一个`CFBundleURLTypes`键,它包含一个数组,每个元素都是一个`CFBundleURLSchemes`键,其值是一个字符串数组,表示我们的自定义URL Scheme。例如,我们可以设置为`myapp`,...
- **交互式评估器**:Scheme拥有一个交互式的评估环境,可以即时测试代码的效果,非常适合学习和调试。 - **教育和研究领域的应用**:自1975年以来,Scheme就被广泛应用于教育和研究领域,尤其是在计算机科学的教学...
这个开发环境对于初学者来说是一个理想的平台,因为它允许他们快速测试代码并实时查看结果,有助于理解和掌握Scheme的基本概念和高级特性。 在"STk-win32"这个压缩包中,我们可以推断出这是专为Windows 32位操作...
在本项目中,我们将探讨如何使用C#来实现一个Scheme解释器。 首先,我们需要理解Scheme的基本语法和数据结构。Scheme的核心在于其 Lisp-like 的括号表示法,即S-表达式(S-expression)。这些表达式可以是原子(如...
其次,Scheme采用了一种叫做“读-求值-打印循环”(Read-Eval-Print Loop,简称REPL)的交互式开发环境,这使得程序员能够快速测试和调试代码。了解如何有效地使用REPL,可以极大地提高学习效率。 再者,Scheme的...
一个Scheme程序可以由一个或多个form组成,通常用小括号括起来。例如: ```scheme (define x 123) (+ 1 2) (* 4 5 6) (display "hello world") ``` 这些form可以是表达式、变量定义或过程。 **Form嵌套:** Scheme...
在iOS和Android等移动操作系统中,开发者可以为自己的应用定义一个唯一的URL Scheme,使得其他应用或系统可以通过特定的URL格式启动该应用,并执行特定的操作。 标题“验证URL Scheme”指的是检查并确认一个URL是否...
总结来说,Color Scheme Designer 3 是一个强大而全面的网页配色工具,能够帮助设计师快速生成和测试色彩方案,同时考虑到了色彩理论、可用性和跨平台兼容性。通过使用这个工具,设计师可以提升其作品的专业性和吸引...
在Android开发中,"通过超链接URL打开一些常见APP(scheme)"是一个常见的功能,它涉及到应用程序间的交互和深度链接技术。此功能允许用户点击一个链接,比如在浏览器或者社交媒体应用中,然后直接跳转到特定的应用...
总结来说,URL Scheme是iOS开发中的一个重要工具,它提供了灵活的应用间通信方式,使得开发者可以创建深度链接,实现界面跳转,增强用户体验。通过正确配置和使用URL Scheme,开发者能够创建更加丰富和互动的应用...
MIT-Scheme是一个基于Lisp方言的解释器,由麻省理工学院(MIT)开发,广泛用于教学、研究和软件开发。它以其高效、简洁和高度可扩展性而著称。源代码的提供为开发者提供了深入理解Lisp语言及其实现机制的机会,同时...
MIT-Scheme是一个强大的Scheme实现,无论是在命令行还是在Emacs下,都能提供优秀的编程体验。通过学习本教程,你将掌握如何使用MIT-Scheme进行编程,包括基础操作和高级功能。同时,提供的相关文件将帮助你在实践中...
在安卓5.0到8.0系统中,所有基于signature scheme V1签名机制的App均受“Janus”漏洞影响。 仅基于signature scheme V2签名的APP在安卓7.0及以上版本系统中不受影响 “Janus”漏洞只针对于安卓5.0-8.0系统下、基于...
- **递归的概念**:递归是Scheme中的一个重要概念,通常用于处理重复性的任务。 - **尾调用优化**:Scheme编译器支持尾调用优化(tail call optimization),这使得递归函数能够高效地执行,避免栈溢出问题。 #### ...
【StartApp.zip】是一个压缩包,包含了一个简单的Android demo项目,其主要目的是通过Android的scheme机制来启动应用程序。在这个demo中,你可以了解到如何利用自定义的scheme地址来判断并启动相应的App。下面是这个...
在这个特定的上下文中,我们讨论的是一个用于生成HomeKit的`setupcode`和`qrCode`的工具源码。这个工具特别之处在于它能够根据不同的配置生成以`X-HM://`开头的二维码,这种二维码是HomeKit设备设置过程中的关键组成...