;; ;; FILE: homework06.rkt ;; AUTHOR: Eugene Wallingford ;; DATE: 2024/02/24 ;; COMMENT: This module defines the five functions specified in ;; Homework 6 as an importable module. ;; ;; MODIFIED: ;; CHANGE: ;; #lang racket (require "syntax-procs.rkt") (provide tails n-list? tree-min declared-vars prefix->postfix) ;; -------------------------------------------------------------------------- ;; Problem 1 (structural recursion) ;; -------------------------------------------------------------------------- (define tails (lambda (lst) (if (null? lst) (list '()) (cons lst (tails (rest lst)))))) ;; -------------------------------------------------------------------------- ;; Problem 2 (mutual recursion) ;; -------------------------------------------------------------------------- (define n-list? (lambda (obj) (or (null? obj) (and (pair? obj) (num-expr? (car obj)) (n-list? (cdr obj)))))) (define num-expr? (lambda (obj) (or (number? obj) (n-list? obj)))) ;; -------------------------------------------------------------------------- ;; Problem 3 (structural recursion) ;; -------------------------------------------------------------------------- (define tree-min (lambda (bin-tree) (if (number? bin-tree) bin-tree (min (first bin-tree) (tree-min (second bin-tree)) (tree-min (third bin-tree)))))) ;; -------------------------------------------------------------------------- ;; Problem 4 (little language) ;; -------------------------------------------------------------------------- (define declared-vars (lambda (exp) (cond ((varref? exp) '()) ((lambda? exp) (cons (lambda->param exp) (declared-vars (lambda->body exp)))) ((app? exp) (append (declared-vars (app->proc exp)) (declared-vars (app->arg exp)))) (else (error 'declared-vars "invalid argument ~a" exp))))) ;; -------------------------------------------------------------------------- ;; Problem 5 (little language) ;; -------------------------------------------------------------------------- (define prefix->postfix (lambda (exp) (cond ((varref? exp) (make-varref exp)) ((lambda? exp) (make-lambda (lambda->param exp) (prefix->postfix (lambda->body exp)))) ((app? exp) (make-app (prefix->postfix (app->arg exp)) ; swap (prefix->postfix (app->proc exp)))) ; 'em! (else (error prefix->postfix "invalid argument ~a" exp))))) ;; --------------------------------------------------------------------------