Обычное упражнение на шутку, присвоение значения строке - PullRequest
0 голосов
/ 12 октября 2019

Я работал над этой проблемой: «сделайте функцию, которая дает два месяца, скажем, если первый месяц появляется перед вторым в календаре, печатая true». Я могу использовать только «минусы», «добавить», «список», «равно», «defun», «car», «cdr», «cond», «T», «NIL»

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

Вот мой код: я не буду вставлять все это, просто потому что я все еще тестирую: я сделал это таким образом, не уверенный, если я присвоил правильное значение месяцу, потому что я не уверен, как присвоить значениестрока.

 (defun months(month)
             (cond ((null month)0)
                   ((= month (format t "january") 1))
                    ((= month (format t "february") 2))
                             nil ))

    the other function:

    (defun check-month(month1 month2)
        (if (< (months month1) (months month2))
            T
            NIL
        )   
    )

and when I called the function check-month it says:

 (check-month "january" "february")

*** - IF: variable months has no value


The actual result should be like this: 
  (check-month “january” ”february”)
      T

Ответы [ 2 ]

3 голосов
/ 13 октября 2019

Format выводит вещи. Там нет смысла. Кроме того, его нет в списке операторов, которым вы можете пользоваться.

= сравнивает числа. Строки не числа. Кроме того, его нет в списке операторов, которым вы можете пользоваться. Из этого списка, используйте equal, чтобы определить равенство.

Это должно ответить на ваш первоначальный вопрос (но «задница» не является английским словом).

Однако, < не всписок операторов, которые вам разрешено использовать, поэтому преобразование строки в число для вас бесполезно.

Вместо этого я бы предложил следующее: учитывая список ("january" "february" "march" …), напишите функцию, которая принимаетимя месяца и возвращает остаток списка, начиная с этого месяца. Затем назовите его с именем первого месяца и убедитесь, что второе значение содержится в возвращаемом значении.

Подсказка: в стандартном неограниченном Лиспе это может выглядеть так: (member month-b (member month-a months :test #'equal) :test #'equal)).

3 голосов
/ 12 октября 2019

Это не ответ в виде кода, поскольку я не хочу делать вашу домашнюю работу за вас.

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

Во-вторых, для какой цели служит выражение типа (if (f ...) t nil)? Единственная полезная цель - если вы хотите канонизировать возвращаемое значение от (f ...) до t или nil. Но что (equal a b) возвращает?

Во-вторых: если вам действительно только разрешено использовать cons, append, list, equal, defun,car, cdr, cond t и nil, тогда вам не разрешено использовать <, или =, или ряд других функций и других операторов, которыеты использовалИтак, у вас есть интересная проблема, которую нужно решить.

Подход к ее решению заключается в написании функции с именем first-in-list: для этого требуется три аргумента, и вот его спецификация:

(first-in-list a b l) возвращает, какой бы из a или b был первым в l, по сравнению с equal или nil, если ни один из них не является (и вам решать, что он вернет, если a и b одинаковы).

Вы можете написать эту функцию с помощью cond, car, cdr, equal, nil, t и вспомогательной функции под названием first-in-list, который вам нужно будет написать.

Теперь вы можете написать функцию month-before-p, которая принимает два аргумента ma и mb и:

  • проверяет, если ma равно mb и возвращает nil, если это так (это позволяет избежать неоднозначности в спецификации first-in-list;
  • проверяет, равно ли (first-in-list ma mb (list "january" ....)) ma или mb;
  • для добавленной стоимости может проверить, был ли результат вызова first-in-list равен nil, что является ошибкой.

Эта функция также может бытьнаписано с cond, equal, t и nil, а также с вспомогательной функцией first-in-list, которую вы уже написали.

...