Схема / Ракетка - Макрос для изменения порядка процедуры и аргументов

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

(> 2 1)

примерно так:

(2 greater 1)

Моя первая попытка - это следующий макрос:

(define-syntax greater 
  (lambda (x)
    (syntax-case x (greater)
      [(a greater b)
       (syntax (> a b))])))

Ошибка при использовании этого макроса: "неверный синтаксис в: больше"

Я просматривал некоторые документы Scheme, но не смог найти способ сделать это.


person sakito    schedule 04.10.2012    source источник


Ответы (3)


Выражение (2 greater 1) - это приложение. Он расширяется до (#%app 2 greater 1). Вы должны определить свою собственную версию #%app и назвать ее, скажем, my-%app. Если greater присутствует, поменяйте местами первый и второй аргумент, в противном случае просто расширите до стандартного #%app.

Чтобы использовать новое приложение, вы должны экспортировать его из файла (модуля), в котором вы его определяете, а затем импортировать его в модуль, в котором вам нужен специальный синтаксис приложения.

person soegaard    schedule 04.10.2012
comment
См .: github.com/dyoo/infix-syntax-example для примера одного способ сделать предложение Йенса. Я старался хорошо задокументировать исходный код, поэтому буду признателен за любые предложения. - person dyoo; 04.10.2012

В Racket уже существует функция чтения, позволяющая использовать общую инфиксную нотацию: напишите точку до и после имени функции или макроса: (2 . > . 1) Это немного многословно (точки должны быть окружены пробелами), но мне это нравится и я использую это много. Дополнительную информацию см. В документации. .

person Paul Stansifer    schedule 04.10.2012
comment
Думаю, это лучшее решение. Из синтаксиса ясно, является ли это обычной префиксной нотацией или специальным инфиксным оператором. Кроме того, (sort some-list <) по-прежнему будет работать - person ReyCharles; 04.10.2012

Вы могли бы сказать, что "фигурно-инфиксная" нотация - это то, что вам нужно. Просто заключите список в {...}, и вы можете записать содержимое списка в инфиксном порядке, а не в порядке префикса (читатель преобразует его). Итак, если вы напишете {x +, y}, читатель отобразит его на (+ x, y).

Curly-infix определен в SRFI-105: http://srfi.schemers.org/srfi-105/

Я знаю, что текущая версия хитрости GNU, по крайней мере, реализует это.

Обозначение "сладкого выражения" SRFI-110 (http://srfi.schemers.org/srfi-110/) построен на основе SRFI-105.

person David A. Wheeler    schedule 14.03.2013