#lang racket (require redex) ;; Grammar, metafunctions, design of metafunctions ;;------------------------------------------------ (define-language Assignments ;; DATA DEFINITION (stmt ::= (x = expr)) (expr ::= 1 x (expr + expr)) (x ::= a b c)) (test-equal (redex-match? Assignments expr (term (a + b))) #t) (test-equal (redex-match? Assignments stmt (term (a = 1))) #t) ;; --------------------------------------------------------------- ;; PROBLEM: Is the given variable a or b? (we don't like c) ;; SIGNATURE & PURPOSE ;; good-var : x -> boolean ;; Is the given variable a or b? (define-metafunction Assignments good-var : x -> boolean [(good-var c) #f] [(good-var x) #t]) #;(define-metafunction Assignments good-var : x -> boolean [(good-var a) #t] [(good-var b) #t] [(good-var c) #f]) (test-equal (term (good-var a)) #t) (test-equal (term (good-var b)) #t) (test-equal (term (good-var c)) #f) (test-results) ;; --------------------------------------------------------------- ;; CONSTRAINT: Assignment statements must use 'a' only on LHS ;; ;; PROBLEM: Design a function that checks whether a ;; given STMT satisfies this constraint ;; --------------------------------------------------------------- ;; PROBLEM: determine the variables that occur in an expr ;; PROBLEM: determine the variables that occur in an stmt