На ваш вопрос можно ответить в достаточно общем контексте, то есть даже без учета конкретного варианта использования HTTP.
Общий вопрос выглядит следующим образом: как я могу динамически выбрать подмножество некоторых доступных параметров.
Для этого предположим, что вы представляете каждую ссылку не просто как «саму себя», а скорее как пару формы Link-Condition
с интерпретацией, что Link
следует включать только если Condition
правда.
Давайте сначала рассмотрим условия, которые мы хотим выразить, и определим, когда они выполняются. Важно отметить, что ваши условия также зависят от значения Foo
, поэтому это необходимо учитывать:
is_true_with_foo(_, has(investigate, body)) :- has(investigate, body).
is_true_with_foo(Foo, Foo = bar) :- Foo = bar.
is_true_with_foo(_, true).
Таким образом, это описывает когда определенное условие истинно, также в зависимости от значения Foo
.
Теперь условия примера можно представить следующим образом:
links_conditions(Foo,
[
a([href='/questionalice'], 'Question Alice')-has(investigate, body),
a([href='/questionbob'], 'Question Bob')-(Foo = bar),
a([href='/investigatebody'], 'Investigate Body')-true
]).
Чтобы описать подпоследовательность списка, рассмотрите возможность использования DCG (dcg).
Например:
links_subset([], _) --> [].
links_subset([L-Cond|Ls], Foo) -->
( { is_true_with_foo(Foo, Cond) } ->
[L]
; []
),
links_subset(Ls, Foo).
Теперь вы можете позвонить:
?- links_conditions(Foo, LCs0),
phrase(links_subset(LCs0, no), LCs).
и получить в LCs
остальные ссылки. В этом случае:
LCs = [a([href='/questionalice'], 'Question Alice'),
a([href='/investigatebody'], 'Investigate Body')].
Итак, мы можем использовать полученные ссылки в нашем ответе:
link_collection(Request) :-
http_parameters(Request, [foo(Foo, [optional(true)])]),
links_conditions(Foo, LCs0),
phrase(links_subset(LCs0, Foo), LCs),
reply_html_page([title('Dynamic Link Collection')], LCs).
Обратите внимание, как в этих предикатах передается Foo
.
P.S.: В вашем фрагменте примера есть элементарные синтаксические ошибки, поэтому я сомневаюсь, что ваш код хоть как-то работает.
person
mat
schedule
05.11.2017
a
, вам нужно заключить их вhtml//1
. Попробуйтеhtml([a(href='...', ...), ...])
, у вас это работает? - person Wouter Beek   schedule 04.11.2017