Функции Smalltalk Variadic

Есть ли в Smalltalk (особенно в Squeak/Pharo) какие-то функции с переменным числом аргументов?

Я только что читал о силе разработки собственных управляющих статусов в smalltalk, и хотя я большой поклонник ifTrue: ifFalse: мне было трудно придумать хороший способ реализовать произвольное if,if else, if else ,...,else операторы, думая о том, насколько полезными были бы функции Variadic для реализации операторов case. Что-то типа

ложный класс

ifTrue: aBlock (... elseIf: aBoolean then: aSecondBlock ...) else: aLastBlock

vArgList pairsDo: [:x :y| x ifTrue:[^ (y value)] ].
^ aLastBlock

person Roman A. Taycher    schedule 06.10.2010    source источник


Ответы (3)


Вы можете использовать сообщение #caseOf:otherwise:. Найдите отправителя этого сообщения для примера.

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

person mathk    schedule 11.10.2010
comment
В принципе согласен. Мне трудно понять, как можно улучшить читабельность использования Андреасом Раабом #caseOf:insewise: в DnsClient (на SqueakSource). - person Frank Shearar; 12.10.2010

Подобный ключевому слову синтаксис Smalltalk для вызовов методов по своей сути определяет арность метода. В Common Lisp нет шаблона &rest.

Конечно, у вас может быть метод, принимающий список, например BlockClosure>>valueWithArguments:, но это вряд ли одно и то же.

Вы можете изменить Compiler для поддержки вызовов вариативных методов. Возможно, вызов просто будет иметь with: между каждой из переменных:

(условие) ifTrue: aBlock elseIf: aBoolean с: aSecondBlock с: otherBoolean с: aThirdBlock

person Frank Shearar    schedule 06.10.2010
comment
Вы не можете изменить только компилятор для этого. Вам также необходимо изменить виртуальную машину. Поскольку количество аргументов находится внутри BlockClosure, они сообщают размер (включая количество аргументов) создаваемого контекста. - person mathk; 12.10.2010

Одна из вещей, которую я усвоил в программировании, заключается не в том, что вам не нужны операторы case, вам не нужны операторы case.

Операторы case — это способ раздуть объект. Когда вы его используете, вы ухудшаете техническое обслуживание. У вас будут все возможности, которые вы хотите в то время, но в тот день, когда вы захотите что-то добавить, вам придется просмотреть неприятный код, когда вы больше не помните тонкостей ответственности этого объекта, поэтому вы его раздуете. даже больше.

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

Также они делают ваш код менее гибким. Например, вы не можете уверенно добавить кейс о предыдущем коде. Вы вынуждены пересматривать старый код, когда уже не помните, почему он был закодирован именно так.

Операторы case — враги хорошего кода.

Если у вас есть что-то, что выходит за рамки ifTrue:ifFalse:, то правильно будет сделать для этого состояния. Итак, что вы делаете, так это реализуете три очень простых класса, и все они понимают некоторые глаголы.

Скажем, #делайСледующее. Поэтому, когда объект получает сообщение, он делегирует его состоянию (в зависимости от того, какое из этих 3 (или 30, так что обратите внимание, что это хорошо масштабирует сложность)) и состояние знает, как заставить исходный получатель реагировать правильно.

Это сделает ваш код легким, очевидным и легко поддерживаемым. Вы сможете забыть об этом, потому что вы знаете, что когда вы посмотрите на это снова, все будет настолько очевидным, что вам не нужно думать о прошлом вашего кода столько, сколько о будущем вашего кода.

Это важно, потому что ваша память — самая дорогая память, которая у вас есть, и, насколько мне известно, ее нельзя обновить. Таким образом, эта техника позволяет вам делать более мощные вещи.

Кроме того, создание 3 классов может показаться для некоторых дополнительной работой, но это не так. Любой новичок может добавить 3 пустых класса в мгновение ока, но только опытный специалист вспомнит, как оператор case в старом коде был сделан таким, каким он был сделан. И если вы настроены крайне оптимистично, вам потребуются минуты, чтобы вспомнить об этом, чтобы вы все знали, что делать дальше. Подумай об этом.

person Sebastian Sastre    schedule 24.10.2010