DrRackt добавление вызова и веселья к языку в подстановочных тестах моделей не пройдет - PullRequest
0 голосов
/ 07 июня 2019

Я использую lang pl для этого.Я внедрил язык «ROL», теперь я пытаюсь расширить язык, чтобы он также поддерживал веселье и звонки с использованием модели замещения.Мой основной код ниже.С некоторой помощью здесь мне удалось сделать это и решить мои проблемы компиляции.проблема, с которой я столкнулся, связана с тремя новыми тестами, которые я добавил, чтобы проверить 'fun' и 'call'.

вот мой код:

(define-type RegE
[Reg Bit-List]
[And RegE RegE]
[Or RegE RegE]
[Shl RegE]
[Id Symbol]
[With Symbol RegE RegE]
[Bool Boolean]
[Geq RegE RegE]
[Maj RegE]
[If RegE RegE RegE]
[Fun Symbol RegE]
[Call RegE RegE])


(define-type RES
[RES_Bool Boolean]
[RegV Bit-List]
[FunV Symbol RegE])

моя функция подмножества

(define (subst expr from to)
  (cases expr
    [(Reg g) expr]
    [(Bool g) expr]
    [(And left right)(And (subst left from to)(subst right from to))]
    [(Or left right)(Or (subst left from to)(subst right from to))]
    [(If bool ifBody elseBody) (If (subst bool from to) (subst ifBody from to) (subst elseBody from to))]
    [(Maj left)(Maj (subst left from to))]
    [(Geq left right)(Geq (subst left from to)(subst right from to))]
    [(Shl left)(Shl (subst left from to))]
    [(Id name) (if (eq? name from) to expr)]
    [(With bound-id named-expr bound-body)
           (if (eq? bound-id from)
               expr
               (With bound-id
                     named-expr
               (subst bound-body from to)))]
        [(Call left right) (Call (subst left from to) (subst right from to))]
    [(Fun bound-id bound-body)
         (if (eq? bound-id from)
           expr
           (Fun bound-id (subst bound-body from to)))])
    )

моя функция eval:

(: eval : RegE -> RES)
;; evaluates RegE expressions by reducing them to bit-lists
(define (eval expr)
  (cases expr
    [(Reg right) (RegV right)]
    [(Bool b) (RES_Bool b)]
    [(Id name) (error 'eval "free identifier: ~s" name)]
    [(And left right) (reg-arith-op bit-and  (eval left ) (eval right) )]
    [(Or left right) (reg-arith-op bit-or (eval left )  (eval right) )]
    [(Shl E1) (RegV (shift-left (RegV->bit-list (eval E1))))]
    [(Maj E1) (RES_Bool (majority? (RegV->bit-list (eval E1))))]
    [(Geq E1 E2) (RES_Bool (geq-bitlists? (RegV->bit-list (eval E1)) (RegV->bit-list (eval E2))))]
    [(With bound-id named-expr bound-body)
       (eval (subst bound-body
                    bound-id
                    (Reg (RegV->bit-list(eval named-expr)))))]
    [(Fun bound-id bound-body) (FunV bound-id bound-body)]
    [(Call fun-expr arg-expr)
       (let ([fval (eval fun-expr)])
         (cases fval
           [(FunV bound-id bound-body)
            (eval (subst bound-body
                   bound-id
                   arg-expr))]
           [else (error 'eval "`call' expects a function, got: ~s"
                              fval)]))]
    [(If E1 E2 E3) (if (RegV->boolean (eval E1)) (eval E2) (eval E3))]


))   

И 3 теста, которые не пройдут:

(test (run "{ reg-len = 3
 {with {identity {fun {x} x}}
 {with {foo {fun {x} {or x {1 1 0}}}}
 {call {call identity foo} {0 1 0}}}}}")
 => '(1 1 0))
 (test (run "{ reg-len = 3
 {with {x {0 0 1}}
 {with {f {fun {y} {and x y}}}
 {with {x {0 0 0}}
 {call f {1 1 1}}}}}}")
 => '(0 0 1))
(test (run "{ reg-len = 4
 {with {foo {fun {z} {if {maj? z} z {shl z}}}}
 {call foo {if {maj? {0 0 1 1}} {shl {1 0 1 1}} {1 1 0 1}}}}}")
 => '(0 1 1 1))

Я получаю сообщение об ошибке:

RegV->bit-list: Given wrong type of RES (FunV x (Id x))

А вот моя функция RegV-> bit-list:

(: RegV->bit-list : RES -> Bit-List)
;; extract a bit-list from RES type
(define (RegV->bit-list r)
  (cases r
    [(RegV bl) bl]
    [else (error 'RegV->bit-list "Given wrong type of RES ~s" r)]
    )
  )

и мой логический RegV->, которые имеют один и тот же принцип:

(: RegV->boolean : RES -> Boolean)
;; extract a boolean from RES type
(define(RegV->boolean res)
  (cases res
    [(RES_Bool b) b]
    [else (error 'RegV->boolean "Given wrong type of RES ~s" res)]))

Эти две функцииРаньше это было:

(: RegV->bit-list : RES -> Bit-List)
;; extract a bit-list from RES type
(define(RegV->bit-list rest)
  (cases rest
    [(RES_Bool b) (error 'RegV->bit-list "Given wrong type of RES")]
    [(RegV bits) bits]))

(: RegV->boolean : RES -> Boolean)
;; extract a boolean from RES type
(define(RegV->boolean res)
  (cases res
    [(RES_Bool b) b]
    [(RegV bits) (error 'RegV->bit-list "Given wrong type of RES")]))

но потом я изменил его, потому что я получаю ошибки .. Любая помощь будет оценена ...

1 Ответ

0 голосов
/ 07 июня 2019

Идея помочь вам найти ошибки.

Марка eval печать expr при вводе:

(define (eval expr)
  (display "eval: ") (displayln expr)
  (cases 
     ...))

Оценить одно из трех оскорбительных выражений. Проверьте, какой шаг в оценке не подходит.

Если вам нужно больше подробностей, заставьте subst напечатать его аргументы.

...