Обозначения функций нелюбимые? - PullRequest
4 голосов
/ 09 октября 2011

Просматривая источники Common Lisp Я замечаю, что люди чаще всего используют #'foo, где достаточно 'foo - то есть, где бы ни указывалось обозначение функции, они предпочитают передавать функцию.

Конечно#'foo необходимо, когда foo определено через flet и так далее.Я понимаю механику всего этого - мой вопрос - вопрос стиля.Это просто потому, что люди не хотят думать о 'foo против #'foo, поэтому они используют второе, потому что первое иногда не работает?Даже если бы это было так, это не объясняло бы использование #'(lambda ...), потому что #' - это , всегда там не нужно.

CL иногда называют некрасивым из-за #',большинство новичков не понимают, что в большинстве случаев это не нужно (я полагаю).Я не новичок, но я предпочитаю 'foo.Почему я необычный?Если я опубликую некоторый код, который дает символы для funcall и apply, буду ли я издеваться и унижаться?Я подумываю открыть в своей области главу «Анонимные указатели функций».Я подозреваю, что люди хотят использовать функциональные обозначения, но из-за давления со стороны сверстников боятся «выйти» из этого.

Ответы [ 3 ]

4 голосов
/ 10 октября 2011

Использование #' концептуально проще: независимо от того, имеете ли вы дело с анонимной функцией, функцией, полученной путем вызова compile, или функцией, на которую ссылается #', вы всегда ссылаетесь на объект функции.Учитывая это, передача символа в map или funcall является странным особым случаем, который просто не так интуитивен, как передача функционального объекта.

Однако существуют случаи, когда символы, возможно, концептуально более приемлемы,например, в случае аргумента :test для make-hash-table.В этом случае вы выбираете одну из четырех различных типов хеш-таблиц, указанных в имени функции сравнения ключей.Я предпочитаю символ в этом случае, так как нет смысла использовать функциональный объект для различения одного вида хеш-таблицы от другого.(Это также вводит в заблуждение, поскольку имеет тенденцию вводить вас в заблуждение, полагая, что вы можете передать любой произвольный предикат эквивалентности make-hash-table.)

3 голосов
/ 10 октября 2011

Они не одинаковы.'foo является ссылкой на то, что является глобальным определением функции foo, и является пережитком старых времен, когда области видимости сильно запутались.

0 голосов
/ 10 октября 2011

Это 2 отдельных стилевых решения, которые каждый должен принять за себя. Я никогда не видел никакой критики ни в одной из четырех комбинаций.

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

Все же я использую lambda без резких кавычек. Хорошее обсуждение этого можно найти в Let over Lambda . И первоначальный аргумент в пользу #'(lambda... идет к Кент Питману, я полагаю.

...