реализация автомобиля в схеме - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь написать в схеме функцию cons.Я написал этот код:

(define (car. z)
    (z (lambda (p q) p))) 

и пытаюсь запустить:

(car. '(1 2 3))

Я ожидаю получить число 1, но оно не работает должным образом.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Ответ Сильвестра великолепен.Вот еще одна возможная реализация null, null?, cons, car, cdr -

(define null 'null)

(define (null? xs)
  (eq? null xs))

(define (cons a b)
  (define (dispatch message)
    (match message
      ('car a)
      ('cdr b)
      (_ (error 'cons "unsupported message" message))
  dispatch)

(define (car xs)
  (if (null? xs)
      (error 'car "cannot call car on an empty pair")
      (xs 'car)))

(define (cdr xs)
  (if (null? xs)
      (error 'cdr "cannot call cdr on an empty pair")
      (xs 'cdr)))

Это работает так -

(define xs (cons 'a (cons 'b (cons 'c null))))

(printf "~a -> ~a -> ~a\n"
        (car xs)
        (car (cdr xs))
        (car (cdr (cdr xs))))
;; a -> b -> c

Это повышаетошибки в этих сценариях -

(cdr null)
; car: cannot call car on an empty pair

(cdr null)
; cdr: cannot call cdr on an empty pair

((cons 'a 'b) 'foo)
;; cons: unsupported dispatch: foo

define/match добавляет немного сахара, если вам нравятся сладкие вещи -

(define (cons a b)
  (define/match (dispatch msg)
    (('car) a)
    (('cdr) b)
    (('pair?) #t)
    ((_) (error 'cons "unsupported dispatch: ~a" msg)))
  dispatch)

((cons 1 2) 'car)   ;; 1
((cons 1 2) 'cdr)   ;; 2
((cons 1 2) 'pair?) ;; #t
((cons 1 2) 'foo)   ;; cons: unsupported dispatch: foo
0 голосов
/ 01 января 2019

При реализации языковых структур данных вам необходимо предоставить конструкторы и методы доступа, соответствующие договору:

(car (cons 1 2))   ; ==> 1
(cdr (cons 1 2))   ; ==> 2
(pair? (cons 1 2)) ; ==> 2

Вот пример:

(define (cons a d)
  (vector a d))
(define (car p)
  (vector-ref p 0))
(define (cdr p)
  (vector-ref p 1))

Теперь, если вы сделаетеВ реализации вы должны реализовать read, чтобы соответствовать этому способу создания пар, чтобы '(1 2 3) создавал правильную структуру данных; простые правила, приведенные выше, остались прежними.

Глядя на car Я представляю cons выглядит так:

(define (cons a d)
  (lambda (p) (p a d)))

Работает с замыканиями.Теперь реализация Scheme с помощью стекового компьютера будет анализировать код для свободных переменных, живущих вне их области видимости, и, таким образом, создавать их в виде блоков.Замыкания, содержащие a и d, мало чем отличаются от векторов.

Я призываю вас реализовать минималистический интерпретатор Scheme.Сначала в Схеме, так как вы можете использовать основной язык, затем другой, чем язык лиспа.Вы даже можете сделать это на эзотерическом языке , но это очень много времени.

...