WedX - журнал о программировании и компьютерных науках

Smalltalk — есть ли что-то похожее на && из C?

Мне нужно написать чисто объектную программу Smalltalk, в которой мне нужно оценивать условия до тех пор, пока одно из них не выйдет из строя. Я знаю, что в C мы можем использовать для этого оператор &&, и условия оцениваются только в случае необходимости.

Есть ли что-то подобное в Smalltalk?


  • Ваш вопрос не очень ясен. Вы спрашиваете о том, что вторая часть условного выражения не оценивается, если в этом нет необходимости? Если да, то есть оператор &, где вторая половина всегда оценивается независимо от того, является ли первая половина false, и есть and:, где аргумент (блок) оценивается только в том случае, если получатель true. 24.02.2017
  • Итак, если у меня есть A и: [ B ] B будет оцениваться только в том случае, если A было правдой? это был именно мой вопрос, я постараюсь быть более ясным в своих следующих вопросах. Спасибо. 24.02.2017
  • Я добавил ответ ниже, чтобы уточнить. Я бы по-прежнему рекомендовал переформулировать ваш вопрос, даже если у вас уже есть ответ, чтобы облегчить задачу следующему человеку, который задается вопросом о том же. 24.02.2017
  • @ Амос М. Карпентер Я только что изменил название, надеюсь, это прояснит большую часть, если все еще неясно, я отредактирую позже, я немного спешу. 24.02.2017
  • Поскольку вы все еще, кажется, слишком заняты, чтобы редактировать свой вопрос, я позволил себе сократить его до того, что я считаю его сутью. Немного о бесконечных полях, о полиморфизме и о вашем конкретном чудовищном упражнении (возможно, более подходящем для комментария) не имело отношения к вопросу, и наличие всего в одном огромном абзаце делало его довольно нечитаемым (что не только важно в кодировании ). Пожалуйста, посмотрите и не стесняйтесь редактировать дальше, если вы чувствуете, что нужно добавить что-то жизненно важное. 26.02.2017
  • Спасибо, @AmosM.Carpenter, я не знал точно, что вы имели в виду, но я понимаю, что вы сделали, и обязательно учту это для моих следующих вопросов, ваше редактирование может сделать более полезным вопрос, который я задал, для кого-то с таким же сомнением в будущем. 26.02.2017

Ответы:


1

Условное "иing" может быть выполнено с помощью сообщения & или сообщения and:.

firstBooleanExpression & secondBooleanExpression
    ifTrue: [ 'do something' ].

Используя &, как показано выше, вторая часть условия (secondBooleanExpression) оценивается независимо от того, оценивается ли первая половина как true или false.

(firstBooleanExpression and: [secondBooleanExpression])
    ifTrue: [ 'do something' ].

С другой стороны, при использовании and: вторая часть оценивается только в том случае, если первая половина оценивается как true. Обычно вы используете эту форму, если вы явно не хотите оценить вторую половину.

Тот же принцип применим к or:.

24.02.2017
  • Просто для протокола: все в Smalltalk, по крайней мере в Pharo, ассоциативно слева направо, также в (firstBooleanExpression или: [secondBooleanExpression]) secondBooleanExpression не будет оцениваться, если firstBooleanExpression истинно, верно? 24.02.2017
  • Да, это правильно. Но имейте в виду, что сообщения имеют приоритет: унарные сообщения (без аргументов) имеют более высокий приоритет. 24.02.2017
  • Да, @MaxLeske, я знаю ... порядок такой: унарные операторы, бинарные операторы и ключевые слова, то, что я не знаю, что именно означают ключевые слова. 26.02.2017
  • @MaxLeske: Большинство диалектов Smalltalk также имеют три одноэлементные псевдопеременные nil, true и false, и я полагаю, что не во всех диалектах есть thisContext (но я могу ошибаться). 27.02.2017

  • 2

    Если я понимаю ваш вопрос, вы ищете что-то вроде этого:

    [ <condition> ] whileTrue: [ <loop body> ].

    #whileTrue: это, конечно, не ключевое слово, и вы можете реализовать его самостоятельно (посмотрите на реализацию в выбранном вами Smalltalk и просветитесь :)).

    Если вам не нужен цикл, а вы просто ищете способ выражения условных выражений, то #ifTrue:, #ifFalse:, #ifTrue:ifFalse: и #ifFalse:ifTrue: — ваши друзья. Примеры:

    myCollection isEmpty ifTrue: [ Transcript open; show: 'empty'; cr ].
    myCollection isEmpty ifFalse: [ Transcript open; show: 'not empty' cr ].
    myBoolean
        ifTrue: [ Transcript open; show: 'true'; cr ]
        ifFalse: [ Transcript open; show: 'false'; cr ].
    
    24.02.2017
  • Я думал о том же, за исключением того, что в данном конкретном случае это не должно быть [ aMonster isNotPathetic ] ifTrue: [ aZone attack: aMonster ] ? 24.02.2017
  • Я добавил использование условных выражений в свой ответ. Это то, что вы хотели знать? 24.02.2017
  • В значительной степени, на самом деле, ответ @Amos M. Carpenter был более точным, но ваш тоже полезен, хотя я сам понял, что ifTrue: или ifFalse: может сделать трюк, мне было интересно, существует ли что-то в smalltalk, что-то аналогично && из C. 24.02.2017
  • @newbie Я думаю, что смысл здесь в том, что да, хотя в Smalltalk может быть механизм, аналогичный механизму в C, в Smalltalk может быть лучший шаблон, в зависимости от сценария. Прямые сопоставления с одного языка на другой часто не приводят к лучшей реализации. 24.02.2017
  • Я буду иметь это в виду @lurker спасибо за совет. 24.02.2017
  • Новые материалы

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

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]