Схема / Ракетка: Как этот язык Хону создает синтаксис без оценочных скобок? - PullRequest
0 голосов
/ 11 февраля 2020

Это язык Хону, созданный с помощью Racket: https://docs.racket-lang.org/honu/Examples.html?q=hon

Язык выглядит так же, как и другие структурированные языки, но он построен поверх Racket, для оценки которого требуются скобки ( ) , Как Honu определяет операторы без скобок?

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

(require syntax/parse/define)
(define-syntax-rule (while Cond Form ...)
  (do [] [(not Cond)] Form ...)
)

(define I 0)
;HOW TO RUN while WITHOUT PARENTHESES?
(while (< I 10)
  (displayln I)
  (set! I (add1 I))
)

Я могу проверить код Ракетки на: https://www.jdoodle.com/execute-racket-online/

1 Ответ

2 голосов
/ 11 февраля 2020

У Хону уже while. Вы можете использовать его следующим образом:

#lang honu

var x = 0
while x < 10 {
  printf("~a\n", x);
  x = x + 1;
}

Вышеприведенная программа печатает 0 в 9.

Honu также предоставляет способ определения ваших собственных макросов с помощью define-honu-syntax в Racket Мир. Вот пример:

;; while.rkt

#lang racket

(provide mywhile)
(require honu-parse
         (for-syntax syntax/parse
                     honu-parse))

(define-honu-syntax mywhile
  (lambda (code)
    (syntax-parse code #:literal-sets (cruft)
      [(_ condition:honu-expression body:honu-body . rest)
       (values
        (racket-syntax (let loop ()
                         (when condition.result
                           body.result
                           (loop))))
        #'rest
        #t)])))
;; test.honu

#lang honu

require "while.rkt";

var x = 0
mywhile x <= 10 {
  printf("~a\n", x);
  x = x + 1;
}

Запуск test.honu также должен вывести 0 в 9.

Honu также поддерживает определение макросов в мире Honu. См. Пример по https://github.com/racket/honu/blob/master/honu/tests/macros2.honu.

...