aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--entries/markusde/good-code/good-code.rkt50
1 files changed, 50 insertions, 0 deletions
diff --git a/entries/markusde/good-code/good-code.rkt b/entries/markusde/good-code/good-code.rkt
new file mode 100644
index 0000000..0f45fc5
--- /dev/null
+++ b/entries/markusde/good-code/good-code.rkt
@@ -0,0 +1,50 @@
+#lang racket
+;; Requires Algebraic Racket https://docs.racket-lang.org/algebraic/index.html
+
+;; When I learned how to program, we kind of had to learn by osmosis.
+;; They would show us good code, and bad code, and say
+;; "write a fibonacci function which relies on how bad your code is"
+
+
+;; Generates a syntax object which comutes the nth fibonacci
+;; number with fib(n) linter warnings
+(define (generate-fib n)
+ (cond
+ [(zero? n) (syntax 0)]
+ [(equal? n 1) (datum->syntax #'lex (quote ((lambda (x) 1) "gregor")))]
+ [else (datum->syntax #'lex
+ (quasiquote (+ (unquote (generate-fib (- n 1)))
+ (unquote (generate-fib (- n 2))))))]))
+
+(eval (generate-fib 0))
+(eval (generate-fib 1))
+(eval (generate-fib 2))
+(eval (generate-fib 3))
+(eval (generate-fib 4))
+
+
+;; Compiles a racket program that computes the fibonacci numbers
+;; Reports the number of linter warnings
+;; Leaves the compiled fibonacci-n binary, which computes fib(n)
+(define (fibonacci n)
+ (begin
+ (define outfile (string-append "fibonacci-" (number->string n) ".rkt"))
+ (define out (open-output-file outfile #:exists 'replace))
+ (displayln "#lang algebraic/racket/base/linted" out)
+ (writeln (syntax->datum (generate-fib n)) out)
+ (close-output-port out)
+ (define err-out (let ([str-port (open-output-string)])
+ (parameterize ([current-error-port str-port])
+ (system (string-append "raco exe " outfile))
+ )
+ (get-output-string str-port)))
+ (delete-file outfile)
+ (println (/ (length (string-split err-out "\n")) 4))))
+
+(fibonacci 0)
+(fibonacci 1)
+(fibonacci 2)
+(fibonacci 3)
+(fibonacci 4)
+
+