SWI-Prolog cgi_get_form (Аргументы) веб-форма для сохранения и обработки аргументов

Я ищу способ сохранения и обработки аргументов веб-формы в SWI-Prolog, когда я отправляю форму и вызываю ту же программу для создания другой формы и так далее. Всегда вызывает одну и ту же программу пролога из одной формы в другую.
Библиотека CGI SWI-Prolog сохраняет эти аргументы в виде списка терминов имени (значения), то есть [Name(Value)].


если я передаю аргументы как скрытый аргумент внутри формы (TotalArguments - это список):

format ('"‹ "input type =" hidden "id =" nameofform1 "name =" nameofform1 "value =" ~ w "/> ~ n', TotalArguments),

Мне нужно избавиться от идентификатора или имени, которые объединяются в моем результирующем списке в TotalArguments, когда я его добавляю. Есть идеи, как это сделать, чтобы окончательный список выглядел как [nameofform1(value1), nameofform2(value2),...]?


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


Редактировать с помощью моего решения, используя скрытую форму
Я решил это, создав:

  extract_value([],_).
  extract_value([A0|__ ], Valor) :-
     A0 =.. [_, Value],
     Valor is Value.

а затем выполните:

extract_value (аргументы, значение),

и отправив скрытое значение формы, например:

format ('‹" input type = "hidden" id = "nameofform1" name = "nameofform1" value = "~ w" /> ~ n', [Значение]),

и добавляем его в следующую форму, чтобы он выглядел так, как я хотел:

[nameofform2 (значение2), nameofform1 (значение1)]


person mll    schedule 03.05.2012    source источник
comment
Что касается вашего редактирования: в этом случае лучше использовать arg / 3: arg (1, A0, Value), поскольку нет необходимости создавать полный список.   -  person mat    schedule 07.05.2012


Ответы (1)


Мне немного непонятно, что именно вам здесь нужно, но чтобы удалить первый элемент списка, который объединяется с данным элементом (особенно если вы точно знаете, что список содержит такой элемент), используйте selectkchk / 3. Например:

selectchk(id(_), List0, List1),
selectchk(name(_), List1, List)

для получения списка List0 без элементов id(_) и name(_). Вид неявного в вашем вопросе, насколько я понимаю, похоже, заключается в том, как создать такой термин, как "form1 (Value)", учитывая имя терминов (form1) и Value. Вы можете сделать это, например, с помощью = .. / 2. Вы можете создать термин T с функтором N и аргументами Args с помощью

T =.. [N|Args]

Здесь нет необходимости писать что-либо в файлы, я бы просто пропустил информацию через формы, как вы это изложили.

person mat    schedule 03.05.2012
comment
Я объясню это немного подробнее: у меня есть nameofform1 (значение1) - ›submit -› новая веб-страница с новой формой - ›cgi_get_form (Args) предыдущей формы -› append (Args, [], TotalArguments) - ›TotalArguments is now [nameofform1 (value1)] - ›сейчас в этой текущей форме nameofform2 (value2) -› submit - ›новая веб-страница -› cgi_get_form (Args) - ›append (Args, TotalArguments, TotalArguments) -› TotalArguments теперь [nameofform2 (value2 ), nameofform1 (nameofform1 (значение1))]. поэтому мне нужно удалить одно nameofform1, чтобы сохранить формат добавленного списка, и конечный результат будет [nameofform2 (value2), nameofform1 (value1)]. - person mll; 03.05.2012
comment
это потому, что скрытые аргументы также должны иметь имя (это может быть кто угодно): format ('‹input type = hidden id = nameofform1 name = nameofform1 value = ~ w /› ~ n', TotalArguments), поэтому мне нужно удалите это Имя из пары Имя (Значение), которое передает CGI, на случай, если я передам аргументы с формами. с файлами - это отдельная история, которая меня тоже интересует. - person mll; 03.05.2012
comment
Вы можете удалить дополнительную оболочку, например, с помощью arg / 3 или просто путем объединения, если вы уже знаете имя функтора: T = nameofform1 (nameofform1 (value1)), T = nameofform1 (This_is_what_I_actually_want), а затем с этого момента используйте This_is_what_I_actually_want. Но если это вообще возможно, я бы вообще постарался не создавать такое странное представление. Если вы переносите информацию из предыдущих форм через скрытые поля, как и другие значения полей, почему вообще возникают такие странные термины? Насколько я понимаю, они должны работать так же, как и другие области. - person mat; 03.05.2012
comment
Большой! Последний комментарий к (= ..) / 2: когда вы знаете, какой аргумент термина вам нужен, используйте вместо него arg / 3, а когда вы знаете функтор, подумайте об использовании простой унификации. - person mat; 04.05.2012