Ответ на этот вопрос member
.В Racket все, что не #f
, является правдой.Следовательно, member
прекрасно работает для проверки наличия элемента в списке:
> (if (member 3 '(1 2 3)) 'present 'absent)
'present
> (if (member 3 '(1 2)) 'present 'absent)
'absent
Нет необходимости специально генерировать #t
при успехе, потому что все в Racket, которое разветвляется, заботится только о #f
и не- #f
значения.
В некоторых редких случаях вам действительно нужно логическое значение, например, если вы собираетесь сохранить результат в некоторой структуре данных и не хотитесохранить ненужную ссылку на список.Обычная идиома для этого в Racket - (and v #t)
, где v
- некоторое значение, поскольку это эквивалентно написанию (if v #t #f)
.Следовательно, вы можете просто окружить свой вызов member
следующим текстом:
> (and (member 3 '(1 2 3)) #t)
#t
Поскольку это крайне редко необходимо, в Racket это более идиоматично, чем написание отдельной функции member?
.