Changeset 5636
View differences
inlineside by side
Show
lines around each change
Show the changes in full context
…
// Дальше — trac.balancer.ru
Увидел и упал
system-time-day-of-week dup 1 = 7 = +
1. Для логического
ИЛИ у нас используется слово
OR.
2. Смотрим, что у нас на стеке:
system-time-day-of-week ( — day )
dup ( day — day day )
1 = ( day day — day day==1? )
7 = ( day day==1? — day {day==1}==7? )
и теперь мы это безобразие складываем. Ужас.
Вот как должно быть:
system-time-day-of-week ( — day )
dup ( day — day day )
1 = ( day day — day day==1? )
swap ( day day — day==1? day )
7 = ( day day==1? — day==1? day==7? )
or ( day==1? day==7? — day==1||day==7 )
А, вообще, лучше возвращать день в виде "понедельник"==1, "воскресенье"==7, что и было сделано в
r5658:
code forth
: system-time-day-of-week ( -- день_недели[1..7] )
7 "java.util.Calendar" class "getInstance" 0 jget "get" { int.class } jget
1- ?dup unless 7 then
;
Надеюсь, понятно, как 1==воскресенье, 2==понедельник... 7==суббота, превращаются в более привычные цифры по формуле:
день := день - 1
если день == 0, то день := 7.unless - это почти то же самое, что
not if
Дальше:
code forth
( ... ) if
true boolean
else
false boolean
then
1. boolean можно вынести за пределы условия и писать только раз:
if true else false then boolean
2. А чему равно
if true else false then? Да
нет операции, вообще-то
3. Наконец, зачем тут boolean? Мы же не в Java-метод объект Boolean передаём.
В итоге весь этот if-блок просто... выкидывается.
code text
: system-time-isNight
system-time-hour dup 12 <= 22 >= + if
system-time-is-offday not if
true boolean
else
false boolean
else
false boolean
then
;
Вообще красота. На два if'а - один then. Мне даже как-то в голову не пришло сделать проверку на такую ошибку на этапе компиляции. Надо будет сделать.
А что по сути? Та же ошибка с
+ вместо
OR и отсутствие
swap между сравнениями.
Дальше. Вложение if'ов - ни что иное, как логическое
И. В итоге от всего этого слова у нас остаётся:
code forth
: system-time-isNight ( -- скидки? )
system-time-hour dup 12 <= swap 22 >= or
system-time-is-offday not and
;
В принципе, это выражение можно даже ещё чуть-чуть упростить, вспомнив слово
WITHIN ( число левая_граница правая_граница -- входит? )
(нужно помнить, что левая граница берётся включительно, правая - исключительно).
Т.е.:
code forth
: system-time-isNight ( -- скидки? )
system-time-hour 11 21 within \ если это день
system-time-is-offday or \ или выходной
not \ скидок нет
;