brainbaking/content/post/scheme.md

85 lines
2.4 KiB
Markdown
Raw Normal View History

2018-05-03 16:09:41 +02:00
+++
title = "Scheme tips and tricks"
subtitle = "Unit testing in Scheme"
archived = true
draft = false
tags = [
"scheme",
"Unit Testing"
]
date = "2013-10-01"
+++
### Variable arguments
Bron: http://www.cs.utexas.edu/ftp/garbage/cs345/schintro-v14/schintro_68.html
```scheme
(define (stack . args)
(display args))
(define (plus a b)
(stack a b)
(+ a b))
(plus 1 2)
```
Print in een lijst `(1 2)` af. In scheme is het mogelijk om args op te splitsen, alles dat na de "." komt, wordt samengenomen als een lijst in een speciale variabele die de rest van de argumenten binnen pakt. Je kan dus ook x aantal argumenten "vast" zetten en de rest laten opvangen door een lijst. `display` print alles in lijst vorm af.
### Conditional Expressions and Predicates
##### Debugging purposes
* `(display arg)` print argument in de `*scheme*` buffer af. (pakt een **lijst** binnen: bvb `(display '("bezig met afdrukken van " arg1 arg2))`
* `(newline)` maakt een nieuwe lijn in diezelfde buffer.
##### de 'undefined' variabele
Een conditional operator die door alle gevallen heen valt (zoals een switch zonder default), retourneert de variabele **unspecific**. Dit is een reserved keyword:
```scheme
(load "./test-manager/load.scm")
(in-test-group conditionals
(define x 0)
(define-test (case-fall-through-returns-undefined)
(assert-equals unspecific
(cond ((< x 0) 1)
((> x 0) 1)))
))
(run-registered-tests)
```
Het is niet mogelijk om die variabele te overschrijven met `(define unspecific 8934)`, volgende fout wordt dan gegenereerd: "Premature reference to reserved name: unspecific."
### Implementaties
* MIT-Scheme: http://www.gnu.org/s/mit-scheme/ -> ingebouwde emacs evaluator
* Racket: http://racket-lang.org/
### Testen schrijven
Testing framework: Zie http://web.mit.edu/~axch/www/testing-1.2.html
Inladen test-manager & testen definen en kunnen wrappen in elkaar à-la Jasmine in JS:
```scheme
(load "./test-manager/load.scm")
(in-test-group my-first-tests
(in-test-group getallekes
(define-test (add-simple-numbers)
(assert-equals (my-add 1 2) 3)))
(in-test-group meer-getallekes
(define-test (add-more-complex-numbers)
(assert-equals (my-add 3 7) 10))))
(run-registered-tests)
```
Achteraf altijd **`run-registered-tests`** evalueren, in de default scheme editor wordt dan de test output getoond. (Default editor = **scheme***, gewoon enter drukken bij open doen nieuwe editor)