Создайте уникальный одноразовый ключ для отправки с помощью формы.
Полагаться на Javascript - плохая идея, потому что он мог быть отключен в клиенте пользователем. В схеме ключей, когда отправка получена сервером, отправка для этого ключа может быть заблокирована. Вы можете отвечать на дубликаты, как вам нравится.
Чтобы этот подход работал, ключи должны быть уникальными и очень трудно предсказать. В противном случае некоторые формы могут быть заблокированы из-за столкновений клавиш. Таким образом, вам не нужно отслеживать ключи для каждой отправки формы и избегать коллизий, ключи должны истечь с сеансом этого пользователя. Еще одна вещь, на которую следует обратить внимание: если злоумышленники смогут предсказать ключ, ваш код может оказаться уязвимым для какого-либо взлома или эксплойта DOS.
Если вы хотите, чтобы в вашем дизайне было что-то, что дошло до крайности в направлении «естественности», Грэм Нельсон сделал несколько действительно потрясающих новая работа по предметно-ориентированному языку программирования, основанному на естественном языке. Система называется Inform 7 и, на мой взгляд, хорошо окупит анализ.
Одна проблема с Inform 7 заключается в том, что презентация полностью ориентирована на непрограммистов. Нелегко даже узнать синтаксис! Но результаты меня очень впечатлили, и я считаю, что есть несколько новых связывающих конструкций, которые предлагают действительно новые идеи - это не просто старые вещи в очень привлекательной упаковке. Стоит проверить!
Я знаю одну форму английского языка, которая пытается быть столь же строгой, как язык программирования (и терпит неудачу): юридический. Поверенного учат писать однозначно по-английски или что-то отдаленно напоминающее английский. (Много латыни, несколько волшебных фраз и т. Д.)
Если вам нужен язык программирования общего назначения, он не будет похож на естественный язык. Естественный язык неоднозначен и основан на высокоинтеллектуальной обработке и, во многих случаях, упражнении в форме вопросов и ответов для устранения оставшейся неоднозначности. Хорошо, чтобы попытаться удалить это; во многих случаях, если человек A что-то говорит человеку B, мнение A о том, что B понял, не совпадает с пониманием B.
На самом деле это проблема не технологии, а скорее природы естественного и искусственного языков .
Конечно, вы можете попробовать реализовать некоторую форму двусмысленности на своем языке, но я не думаю, что это будет полезно. Хотя может быть интересно поиграть, и это ваша цель.
На самом деле, я не думаю, что это хорошая идея. сделать код более похожим на естественный язык. Это станет слишком многословным. Есть причина, по которой никто не использует COBOL очень мало людей охотно используют COBOL:
это предложение неверно
Мне нравятся математика и программирование, потому что они достаточно абсолютны.
Человеческий язык передает эмоции и неоднозначность. Вот почему я всегда ссорюсь с людьми. Если вы не хотите, чтобы ваш компьютер спорил с вами, а ваш компилятор делал абстрактные случайные предположения, придерживайтесь логических языков, которые я реконструирую.
Я полагаю, что перевод естественного языка в конкретную семантику намного сложнее, чем извлечение неопределенного значения из предложения через НЛП. За исключением предложений вроде:
call method on sigkill then quit program
Что в значительной степени похоже на SQL по своей структуре.
Вы можете использовать некоторую форму самоопределяющейся, аксиоматической семантической установки (например, Self или аналогичной) с некоторым сходством с лямбда-исчислением. . править : Похоже на Лисп. Я отказываюсь от этого заявления ..
Из того, что я недавно видел, можно конструировать наиболее «естественные» языки программирования для конкретных областей. Когда вы переходите к обычным языкам программирования, вещи должны становиться более общими, и в результате они читаются менее естественно. Я считаю, что CSS - довольно естественный способ программирования, поэтому непрограммисты могут подобрать его и довольно хорошо применить. Я думаю, вам будет сложно сделать язык общего пользования более естественным для чтения, чем какой-нибудь хорошо составленный код Ruby, который я видел. С другой стороны, если вы имеете дело с определенной областью, вы можете делать удивительные вещи, когда вам нужно использовать только ограниченный словарный запас.
Ваше утверждение:
A Dog is a mammal.
It may Bark and Run.
To Run it uses its feet to move forward.
It does Lay.
Звучит не как настоящий естественный язык, а как форма управляемого языка .
Двумя примерами, которые имеют машинно-понятную семантику, являются Attempto Controlled English , который отображается на концептуальные графы , и Gellish , который используется в качестве языка моделирования данных. 126] Я не могу придумать прямой перевод ваших утверждений о «Собаке», поскольку первое утверждение, кажется, говорит о подтипе млекопитающих, которыми являются собаки, но затем вы начинаете говорить об одном экземпляре; вам нужно быть немного более строгим, чтобы использовать существующие контролируемые языки, например.
Every dog is a mammal.
Every dog may bark, or run.
To run is a forward movement.
Every dog uses its feet to run.
Every dog does lay.
(хотя время от времени это теряет какое-либо представление о кладке)
Что означает «использование»?
Что «использует» подразумеваете в своем примере?
И я описывал методы экземпляра объекта «Собака». Я никогда не говорил ничего вроде «Пятно - это собака. Спот начинает бежать ».
"Собака" - это объект, или вы имели в виду класс всех собак? Вы, кажется, имеете в виду всех собак, и большинство контролируемых языков требует этого различия. «Собака - это млекопитающее» vs «Собака в саду». В книгах по nlp это называется «проблемой слона».
Для меня это создаст экземпляр и прикажет ему запустить.
Я не знаю, как бы я описал статический метод для собаки.
В естественном языке нет такой вещи, как «статический метод», так почему вы ожидаете, что сможете описать такую вещь в что-то полученное из естественного языка?
Вы можете определить отношение, которое имеет область видимости "
Я поддержу предложение взглянуть на Inform 7. В течение последнего месяца или около того я писал интерактивную художественную литературу с помощью Inform7, и это действительно впечатляющий язык. Я считаю, что это освежающий отход от языков, на которых я кодирую обычно, потому что я все еще что-то создаю, но описываю это гораздо более естественным образом.
Например, это была бы совершенно правильная (хотя и короткая) программа в Inform7:
The Building Lobby is a room. "You are standing in the lobby of a building."
There is a supporter called desk here. "A large reception desk is to your right."
There is a device called lamp on the desk which is switched off.
There is a container called trash can on the floor next to the desk.
There is a thing called crumpled paper in the trash can.
Взгляните на функцию Rebol Parsing. Он может определять DSL на основе правила. Ты мог бы легко оправдать ваши ожидания с минимальным кодом