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);
Я только использую макросы Схемы (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.
Я начну отвечать на последний вопрос. Когда использовать макрос вместо функции. Макросы делают вещи, функции не могут, и функции делают вещь, макросы не могут, таким образом, будет трудно смешать их, но давайте пойдем глубже.
Вы используете функции, когда Вы хотите оцененные аргументы и макросы, когда Вы хотите неоцененные аргументы. Это не очень полезно, не так ли? Вы используете макросы, когда Вы хотите записать что-то по-другому, когда Вы видите шаблон, и Вы хотите абстрагировать. Например: Я определяю три функции, вызванные нечто - создают, процесс нечто и нечто - уничтожают для различных значений нечто и с подобными телами, где единственное изменение является нечто. Существует шаблон, но также высокого уровня для функции, таким образом, Вы создаете макрос.
В моем скромном опыте макросы в Схеме к используемому так же, как в другом Шепелявит, как язык Common LISP или Clojure. Я предполагаю, что это - доказательство, что, возможно, гигиенические макросы не являются такой хорошей идеей, и здесь я не согласился бы с Paul Graham о почему. Это - не потому что иногда Вы хотите быть грязны (антисанитарный), но потому что гигиенические макросы заканчивают тем, что были сложными или замысловатыми.
Автоматы через бумагу Макросов представляют жемчуг функционального программирования при реализации конечных автоматов через макросы в Схеме.
Книга Обоснованный Интриган заканчивается полной макрооснованной реализацией miniKanren, язык логического программирования, используемый в книге. Эта работа представляет miniKanren и его реализацию более официально и кратко, чем в книге.
Практический язык Common LISP, Peter Seibel, имеет хорошее введение в макросы. На Lisp, Paul Graham, мог бы быть хороший источник более сложных примеров. Кроме того, имейте взгляд на встроенные макросы в, скажем, языке Common LISP.
Макросы необходимы для реализации новых управляющих структур и новых обязательных конструкций.
Таким образом ищите эти виды конструкций по 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 ...)))]))
Примером более усовершенствованного макроса, который не является скрытой формой лямбды, является макрос языка Common LISP со слотами, который заставляет объектный доступ слота быть похожим на обычный переменный доступ:
(with-slots (state door) car
(when (eq state :stopped)
(setq state :driving-around)
(setq door :closed)))
Обратите внимание, что это не то же, столь же обязательное, слот оценивает локальным переменным и получающий доступ к ним, как со слотами позволяет Вам изменять слоты посредством SETQ и сразу видеть внешние изменения.
Макросы схемы позволили Вам добавить опции, которые авторы языка оригинала не включали сами; это - целая философия позади макросов.
Вот крошечный пример: Схема PLT обеспечивает язык для записи презентаций под названием Слайд-шоу. Я использовал макросы для соединения номера слайда со слайдом так, чтобы я мог более легко управлять ими.
У меня был a curry
макрос, когда я раньше делал много схемы на моей ладони. Это было довольно удобно.
Я написал макрос, который предоставляет инфиксный синтаксис. Ничего особенного; без приоритета. Хотя в целом меня устраивает префиксный синтаксис, я предпочитаю инфиксные для <и>.