brainbaking/content/post/scheme.md

2.4 KiB

+++ 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

(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:

(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

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:

(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)