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', [Стойност]),

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

[именаформуляр2(стойност2),именаформуляр1(стойност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)

за да получим List, който е List0 без елементите id(_) и name(_). Донякъде имплицитно във вашия въпрос, както разбирам, изглежда е как да се създаде термин като "form1(Value)", като се имат предвид термините name(form1) и Value. Можете да направите това например с =../2. Можете да създадете термин T с функтор N и аргументи Args с

T =.. [N|Args]

Не изглежда необходимо да записвате нищо във файловете тук, просто бих прекарал информацията през формуляри, точно както очертавате.

person mat    schedule 03.05.2012
comment
Ще го обясня малко повече: имам nameofform1(value1) -› submit -› нова уеб страница с нов формуляр -› cgi_get_form(Args) на предишния формуляр -› append(Args, [], TotalArguments) -› TotalArguments е сега [nameofform1(value1)] -› сега на този текущ формуляр nameofform2(value2) -› изпращане -› нова уеб страница -› cgi_get_form(Args) -› append(Args, TotalArguments, TotalArguments) -› TotalArguments вече е [nameofform2(value2) ), именаформа1(именаформа1(стойност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