Schema



  • Ne, nich XML Schema :p. Scheme. Folgender Code (-sammlung):

    (define avg
      (lambda x
        (letrec ((sum (lambda (result list)
                        (if (null? list)
                          result
                          (sum (+ result (car list)) (cdr list))))))
          (/ (sum 0 x) (length x)))))
    
    (define != (lambda (x y) (not (= x y))))
    
    (define pythagoras
      (lambda (x y) (sqrt (+ (* x x) (* y y)))))
    
    (define min2
      (lambda (x y z)
        (cond ((and (< x z) (< y z)) (list x y))
              ((and (< x y) (< z y)) (list x z))
              (else (list y z)))))
    
    (define pythagoras-triple-correct
      (lambda (x y z)
        (let ((m2 (min2 x y z)))
          (cons (apply pythagoras m2) m2))))
    
    (define coord
      (lambda (x y)
        (lambda a
          (if (null? a)
            (cons x y)
            (let ((msg (car a)) (params (cdr a)))
              (case msg
                ((x) x)
                ((y) y)
                ((set-x!) (set! x (car params)))
                ((set-y!) (set! y (car params)))
                ((set!)
                 (begin
                   (set! x (car params))
                   (set! y (cadr params))))
                ((display)
                 (begin
                   (display #\()
                   (display x)
                   (display #\,)
                   (display y)
                   (display #\))))))))))
    
    (define coord2
      (lambda (x y)
        (lambda (id)
          (case id
            ((x) x)
            ((y) y)
            ((x'y) (cons x y))
            ((set-x!) (lambda (v) (set! x v)))
            ((set-y!) (lambda (v) (set! y v)))))))
    
    (use-syntax (ice-9 syncase))
    
    (define-syntax
      func
      (syntax-rules
        (with-return with-recursion)
        ((func args body) (lambda args body))
        ((func args with-return r body)
         (lambda args
           (call-with-current-continuation
             (lambda (r) body))))
        ((func args with-recursion n body)
         (letrec ((n (lambda args body))) n))
        ((func args with-recursion n with-return r body)
         (letrec ((n (lambda args
                       (call-with-current-continuation
                         (lambda (r) body)))))
           n))))
    
    (define bla
      (func (x . y)
            with-recursion
            r
            (if (null? y) x (apply r y))))
    

    Hab ich Scheme verstanden?



  • Original erstellt von Mr. N:
    **```
    (define avg
    ...

    Ich nehme an, Du willst alle Elemente einer Liste aufaddieren und das Resultat durch die Anzahl der Elemente dividieren?

    (define avg                            ; (define (avg lst) ...
      (lambda (lst)
        (/ (apply + lst) (length lst))))
    

    Was genau die coord-Funktionen machen sollen, hat sich mir nicht erschlossen. Könnte daran liegen, dass alle Variablen bei dir x oder y heißen 🙂 (oder an meinem derzeitigen Zustand :)). Das ist generell ein Problem, bei so allgemeinen Funktionen.

    (use-syntax (ice-9 syncase))
    

    Was macht das?



  • Original erstellt von Daniel E.:
    Ich nehme an, Du willst alle Elemente einer Liste aufaddieren und das Resultat durch die Anzahl der Elemente dividieren?
    Jo.

    **```
    (define avg ; (define (avg lst) ...
    (lambda (lst)
    (/ (apply + lst) (length lst))))

    Hätte noch sagen sollen, dass das ne Übung zur Benutzung von letrec war.  
      
    **Was genau die coord-Funktionen machen sollen, hat sich mir nicht erschlossen. Könnte daran liegen, dass alle Variablen bei dir x oder y heißen (oder an meinem derzeitigen Zustand ). Das ist generell ein Problem, bei so allgemeinen Funktionen.[/b]**  
    Coord macht folgendes: Es konstruiert ein Objekt mit 2 Membern: x und y. Also eine *Coord*inate...  
      
    **(use-syntax (ice-9 syncase))  
    Was macht das?**  
    Das schaltet (ich benutz guile) define-syntax, syntax-rules etc. ein.

Anmelden zum Antworten