В Clojure, каков хороший способ сравнить строки пользовательского ввода с длинными?

#string #types #clojure

#строка #типы #clojure

Вопрос:

В Clojure я создаю карточную игру. Карты имеют масть и счет.

 {:suit 1 :score 9}
  

Карты создаются с использованием диапазонов, например (диапазон suitTotal), поэтому класс значений :suit и :score является длинным.
Игроки отправляют командные строки, например, «discard1.9» — это запрос на удаление.
Использование регулярного выражения для анализа этого:

 (re-seq #"[0-9] " command)
  

результаты в строковых элементах «1» и «9». Карточка, созданная с этими результатами, будет

 {:suit "1" :score "9"}
  

Я бы хотел, чтобы это сравнивалось как равное с исходной картой. На данный момент я использую (Integer / parseInt) для преобразования строк.

Значение suit может быть построено из другого типа, такого как ключевое слово, но значение score используется как число в другом месте.

Комментарии:

1. Итак, вы прочитали числа как строки и проанализировали их. В чем вопрос?

2. Кроме этой области, программа является clojure. Использование Integer / parseInt похоже на использование java interop и type соображений, когда для достижения этой цели должен быть более идиоматический способ clojure.

3. @JamesPetry: 1 но… Любопытство убило кошку: почему вы используете такие обозначения, как «discard1.9» ? Это кажется не очень удобным для чтения: обычно в покерном программном обеспечении (трекеры, оценщики рук и т. Д.) Вы найдете обозначения типа «Ac» , а не «1.9» (где «Ac» означает «Туз треф»).). Даже если это просто внутренняя ваша отладка / трассировка / комментирование звучит так, как будто это можно было бы облегчить, если бы вы сохраняли обозначения, близкие к «реальным», нет !? Также обычно у игрока есть карты «x», и он не говорит «Я сбрасываю Ac» , он говорит «Я сбрасываю 2-ю карту из моей руки» (я имею в виду, с точки зрения программного обеспечения)

4. @JamesPetry: особенно видно со стороны другого игрока: все, что они видят, это «Игрок x сбросил свою 2-ю и 5-ю карту» , и они не знают, что это за карты. Если вы сделаете это с помощью «отбросить 1.9» , вам нужно будет затем вычислить местоположение «1.9», чтобы узнать, какая карта была сброшена… Что кажется странным, поскольку у вас была эта информация в первую очередь, когда игрок нажимал на карты, прежде чем отбросить их. Кроме того, когда «истории рук» записываются на диск, другие игроки не должны знать, какие карты были сброшены другими. Я бы выбрал «Показывает переменный ток» и «Сбрасывает 3-ю карту» и т. Д.

Ответ №1:

используйте read-string

ДЕМОНСТРАЦИЯ

 user=> (read-string "1")
1
  

Комментарии:

1. может быть опасно при вводе пользователем ….. если вы не отключите * real-eval *, то это можно использовать для выполнения произвольного кода.

Ответ №2:

Хорошим подходом было бы проанализировать строки как числа, а затем использовать = для сравнения.

 user=> (Integer/parseInt "1")
1
  

Преимущество этого перед строкой чтения заключается в том, что это более ограничено. Это не будет анализировать строки, которые выглядят как структуры данных clojure.