Каковы некоторые вещи, для которых Вы использовали макросы Схемы? [закрытый]

Column not found указывает, что вы используете какое-то имя столбца, которого нет в БД.

Проблема здесь:

$sql = "SELECT * FROM klant WHERE klant.Gebruikersnaam = $test";

Ваше значение $test равно jan, и это не имя столбца. Так что нужны кавычки: [...] = '$test', но это неправильно / небезопасно.

Используйте подготовленный оператор для этих запросов, чтобы также решить SQL-инъекцию:

$sql = "SELECT * FROM klant WHERE Gebruikersnaam = :name";

$stmt = $db->prepare($sql)
$stmt->execute([':name' => $test]);
$data = $stmt->fetch(\PDO::FETCH_ASSOC);
10
задан Eli Barzilay 8 June 2010 в 21:12
поделиться

10 ответов

Я только использую макросы Схемы (define-syntax) для крошечных вещей как лучший синтаксис лямбды:

(define-syntax [: x]
  (syntax-case x ()
    ([src-: e es ...]
     (syntax-case (datum->syntax-object #'src-: '_) ()
       (_ #'(lambda (_) (e es ...)))))))

Который позволяет Вам записать

[: / _ 2]  ; <-- much better than (lambda (x) (/ x 2))

У Dan Friedman есть изгибающая ум реализация OO с помощью макросов: http://www.cs.indiana.edu/~dfried/ooo.pdf

Но честно, все полезные макросы, которые я определил, украдены от Paul Graham На Lisp и обычно легче записать с defmacro (define-macro в Схеме PLT). Например, aif довольно ужасно с define-syntax.

(define-syntax (aif x)
  (syntax-case x ()
    [(src-aif test then else)
     (syntax-case (datum->syntax-object (syntax src-aif) '_) ()
       [_ (syntax (let ([_ test]) (if (and _ (not (null? _))) then else)))])]))

define-syntax нечетно в этом, это только просто в использовании для очень простых макросов, где Вы рады неспособности получить переменные; и очень сложный макро-DSLs, где Вы рады неспособности получить переменные легко. В первом случае Вы хотите написать код, не думая об этом, и во втором случае Вы думали достаточно о DSL, что Вы готовы записать часть его в syntax-rules/syntax-case язык, который не является Схемой, чтобы не мистифицировать ошибки.


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

Таким образом, я рекомендовал бы Практический язык Common LISP и На Lisp. Если Вы хотите использовать Схему PLT, я думаю большая часть об их defmacro макросы будут работать с define-macro. Или просто используйте язык Common LISP.

6
ответ дан 3 December 2019 в 14:54
поделиться

Я начну отвечать на последний вопрос. Когда использовать макрос вместо функции. Макросы делают вещи, функции не могут, и функции делают вещь, макросы не могут, таким образом, будет трудно смешать их, но давайте пойдем глубже.

Вы используете функции, когда Вы хотите оцененные аргументы и макросы, когда Вы хотите неоцененные аргументы. Это не очень полезно, не так ли? Вы используете макросы, когда Вы хотите записать что-то по-другому, когда Вы видите шаблон, и Вы хотите абстрагировать. Например: Я определяю три функции, вызванные нечто - создают, процесс нечто и нечто - уничтожают для различных значений нечто и с подобными телами, где единственное изменение является нечто. Существует шаблон, но также высокого уровня для функции, таким образом, Вы создаете макрос.

В моем скромном опыте макросы в Схеме к используемому так же, как в другом Шепелявит, как язык Common LISP или Clojure. Я предполагаю, что это - доказательство, что, возможно, гигиенические макросы не являются такой хорошей идеей, и здесь я не согласился бы с Paul Graham о почему. Это - не потому что иногда Вы хотите быть грязны (антисанитарный), но потому что гигиенические макросы заканчивают тем, что были сложными или замысловатыми.

7
ответ дан 3 December 2019 в 14:54
поделиться

Автоматы через бумагу Макросов представляют жемчуг функционального программирования при реализации конечных автоматов через макросы в Схеме.

Книга Обоснованный Интриган заканчивается полной макрооснованной реализацией miniKanren, язык логического программирования, используемый в книге. Эта работа представляет miniKanren и его реализацию более официально и кратко, чем в книге.

3
ответ дан 3 December 2019 в 14:54
поделиться

Практический язык Common LISP, Peter Seibel, имеет хорошее введение в макросы. На Lisp, Paul Graham, мог бы быть хороший источник более сложных примеров. Кроме того, имейте взгляд на встроенные макросы в, скажем, языке Common LISP.

3
ответ дан 3 December 2019 в 14:54
поделиться

Макросы необходимы для реализации новых управляющих структур и новых обязательных конструкций.

Таким образом ищите эти виды конструкций по http://planet.plt-scheme.org. В PLaneT Вы оба просматриваете документацию и код.

Примеры для новых управляющих структур:

http://planet.plt-scheme.org/package-source/soegaard/control.plt/2/0/planet-docs/manual/index.html

Для нахождения примеров новых обязательных форм ищите макросы, которые начинаются "с -". Один полезный пример найден в math.plt также от PLaneT.

  ; Within a (with-modulus n form1 ...) the return values of
  ; the arithmetival operations +, -, * and ^ are automatically
  ; reduced modulo n. Furthermore (mod x)=(modulo x n) and
  ; (inv x)=(inverse x n).

  ; Example: (with-modulus 3 (^ 2 4)) ==> 1

  (define-syntax (with-modulus stx)
    (syntax-case stx ()
      [(with-modulus e form ...)
       (with-syntax ([+   (datum->syntax-object (syntax with-modulus) '+)]
                     [-   (datum->syntax-object (syntax with-modulus) '-)]
                     [*   (datum->syntax-object (syntax with-modulus) '*)]
                     [^   (datum->syntax-object (syntax with-modulus) '^)]
                     [mod (datum->syntax-object (syntax with-modulus) 'mod)]
                     [inv (datum->syntax-object (syntax with-modulus) 'inv)])
         (syntax (let* ([n e]
                        [mod    (lambda (x)   (modulo x n))]
                        [inv    (lambda (x)   (inverse x n))]
                        [+      (compose mod +)]
                        [-      (compose mod -)]
                        [*      (compose mod *)]
                        [square (lambda (x) (* x x))]
                        [^      (rec ^ (lambda (a b)
                                         (cond
                                           [(= b 0)   1]
                                           [(even? b) (square (^ a (/ b 2)))]
                                           [else      (* a (^ a (sub1 b)))])))])
                   form ...)))]))
8
ответ дан 3 December 2019 в 14:54
поделиться

Примером более усовершенствованного макроса, который не является скрытой формой лямбды, является макрос языка Common LISP со слотами, который заставляет объектный доступ слота быть похожим на обычный переменный доступ:

(with-slots (state door) car
  (when (eq state :stopped)
    (setq state :driving-around)
    (setq door :closed)))

Обратите внимание, что это не то же, столь же обязательное, слот оценивает локальным переменным и получающий доступ к ним, как со слотами позволяет Вам изменять слоты посредством SETQ и сразу видеть внешние изменения.

1
ответ дан 3 December 2019 в 14:54
поделиться

Макросы схемы позволили Вам добавить опции, которые авторы языка оригинала не включали сами; это - целая философия позади макросов.

Вот крошечный пример: Схема PLT обеспечивает язык для записи презентаций под названием Слайд-шоу. Я использовал макросы для соединения номера слайда со слайдом так, чтобы я мог более легко управлять ими.

1
ответ дан 3 December 2019 в 14:54
поделиться

У меня был a curry макрос, когда я раньше делал много схемы на моей ладони. Это было довольно удобно.

1
ответ дан 3 December 2019 в 14:54
поделиться

Я использую их, когда процедуры не достаточны.

0
ответ дан 3 December 2019 в 14:54
поделиться

Я написал макрос, который предоставляет инфиксный синтаксис. Ничего особенного; без приоритета. Хотя в целом меня устраивает префиксный синтаксис, я предпочитаю инфиксные для <и>.

1
ответ дан 3 December 2019 в 14:54
поделиться