|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
По роду работы пытаюсь освоить gt.m но что то пока получается не очень. Например есть код:prog4 s i=0 f q:i=20 d . s i=i+1 . w !,i . q:i=10 w ! q После "d" идёт два пробела! Этот код компилируется без ошибок, а вот если после "f q:i=20" поставить один пробел вместо двух, то уже при компиляции выдаёт ошибку. Почему не понятно, я ведь после for поставил два пробела - бесконечный цикл, поэтому насколько я понял после строки "f q:i=20" можно ставить один пробел. Или это не так? Потом следующий момент. Если убрать "q:i=20" и написать " f d " то хоть ставь в теле цикла выход по условию (q:i=10) хоть не ставь всё равно не выйдешь, надо для выхода писать вот так "f q:i=20 d" Я так понял что в теле цикла если ставить выход то он не действует. так это или я ошибаюсь? Далее есть вот такой код:prog3 s i=0 i i=0 d . s i=i+1 . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i . s i=i+1 . g:i=5 met1 . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i . s i=i+1 e d.. . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i . s i=i+1 met1 w !,i После "d" в строке "i i=0 d " два пробела. Результатом работы этой программы будет: Код: plaintext 1. 2. 3. 4. 5.
Вопрос, откуда появилась вторая пятёрка?? Одна пятёрка должна быть, но откуда вылезла вторая? За помощь буду очень благодарен!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 00:46 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567вот если после "f q:i=20" поставить один пробел вместо двух, то уже при компиляции выдаёт ошибку.потому что компилятор ожидает результат выхода q result, 2 пробела это выход без результата ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 11:13 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
и вот из документации http://tinco.pair.com/bhaskar/gtm/doc/books/pg/UNIX_manual/ch06s17.html The postconditional QUIT terminates the FOR loop. Note the two spaces after the QUIT because it has no argument. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 13:09 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567Вопрос, откуда появилась вторая пятёрка?? потому что у вас код в met1 выполняется дважды, когда выполнялся do у вас перешло выполнение ниже по стеку (как подпрограмма) первый раз когда вы переходите в met1 по goto, потом происходит выход, так как закончился код, выход обратно по стеку наверх (выход из подпрограммы) а значит, должен выполнится код, который идет дальше, а дальше у вас опять только met1, который выполняется повторно если вы перед ним поставите quit то все будет как надо ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 13:24 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567Если убрать "q:i=20" и написать "f d " то хоть ставь в теле цикла выход по условию (q:i=10) хоть не ставь всё равно не выйдешь,Да, все верно quit в теле стека DO означает выход из этой подпрограммы, а не выход из цикла, выход из цикла командами в той же строке где и цикл, как до команды do с двумя пробелами та и после, как в примере ниже set q=0 for i=1:1 do quit:q . write !,i . set:i=5 q=1 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 13:41 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
DAiMor, Огромное спасибо за помощь! Ещё хочу уточнить некоторые детали. Если я запускаю свою программу d ^prog4 и втеле цикла у меня команда quit по которой я получается выхожу из программы prog4 но при этом остаюсь в цикле и он выполняется...?? Я не пойму как это. Если я выйду из программы то всё что в ней выполнялось должно прекратиться, или это не так? Что то этот момент я не пойму. DAiMor можете объяснить поподробней. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 14:23 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567, Что то этот gt.m очень какой то запутанный. По поводу цикла, я так понял что само тело цикла будет запущено как подпрограмма и по quit я выхожу из этой подпрограммы - то есть из цикла, но при этом сам цикл продолжает выполняться. Что то я совсем не пойму как это? По поводу двух пятёрок. Тело if и else запускаются то же как подпрограммы и когда по goto я выпрыгиваю из этой подпрограммы и когда заканчивается программа prog3 я обратно возвращаюсь в тело if но так как я раньше выпрыгнул из него то оно должно закончиться и я опять из него выхожу на строку которая идёт за телом if, else, а это как раз и есть метка met1. Это так? Получается что если выпрыгеуть по goto не из тела if, else, а из запущенной программы то когда она закончиться всё равно будет возврат туда откуда выпрыгнул? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 14:44 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567, смотри, команда do с двумя пробелами, и со всем кодом начинающимся на точки, для for это как одна команда do это вызов подпрограммы, она может быть указана по имени, либо вот так через точки, это не важно, важно что выход из нее, влияет только на эту подпрограмму . quit это не выход из программы, а выход из подпрограммы то же самое и с IF ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 15:12 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
DAiMor, извини что надоедаю, но мне надо разобраться. Просто работа будет связанна с gt.m, а не разобравшись работать не смогу. Получается что я вышел из подпрограммы, но подпрограмма это и есть тело цикла или тело if, else. получается что я вышел из цикла или if, else и должен выполнять то что идёт за циклом или if, else и больше к циклу или if, else не возвращаться, а я получается возвращаюсь. В цикле вообще возвращаюсь всё время, а в if, else один раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 15:22 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567, С вызовом по do подпрограмм написанных в других файлах как то всё укладывается в мою логику, а вот с for, if, else не могу разобраться. Получается если подпрограмма вызвана по do то она отработает полностью или до первой встречи quit, а потом продолжится выполнение программы из которой была вызвана эта подпрограмма. Пока не пойму как это привязать к for, if, else. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 15:30 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567Получается что я вышел из подпрограммы, но подпрограмма это и есть тело цикла или тело if, else. Подпрограмма это не тело цикла. Вы можете вызвать не одну подпрограмму, а много:f q:i=20 d someprog1,someprog2,someprog3 ... someprog1 ; выход из Q someprog2 ; каждой Q someprog3 ; подпрограммы != выход из тела цикла Q ЗЫ: делать так, как в моем примере (процедуры через запятую), не надо. Плохо читаемо. Лучше так:f q:i=20 d label ... label d someprog1 d someprog2 d someprog3 Q someprog1 ; выход из Q someprog2 ; каждой Q someprog3 ; подпрограммы != выход из тела цикла Q ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 15:31 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567но подпрограмма это и есть тело цикла или тело if, else.нет, подпрограмма никакого отношения к телу цикла или условия не имеет, и вход из нее возвращает исполнение к телу цикла или условия ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 15:36 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
П.С.М., это понятно, но в моём случае после do нет названий подпрограмм, после do стоит два пробела что указывает на то что вызывается подпрограмма - тело цикла. Насколько я понял (может я конечно ошибаюсь!) do с двумя пробелами и будет означать что вызывается подпрограмма которая и есть само тело цикла и если я вышел из неё то вышел и из тела цикла - получается что из цикла и должен продолжить выполнение того что написано после тела цикла то есть строки без точек. А получается что выхода никакого нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 15:41 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567, DAiMor я своё последнее сообщение написал перед тем как прочёл твоё последнее сообщение. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 15:42 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567, сейчас ещё попробую поэкспериментировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 15:43 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567, в Caché есть возможность использования фигурных скобок, и тут уже проще ориентироваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 15:45 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567 но в моём случае после do нет названий подпрограмм Это не важно. У Вас происходит вызов "неименнованной" процедуры. Виталийv4567после do стоит два пробела что указывает на то что вызывается подпрограмма - тело цикла Вызывается подпрограмма из тела цикла! ЗЫ: Уж не знаю есть ли в gt.m переменная $STACK (хотя должна быть), вот почитайте из документации к Каше ( тынц ). Думаю поможет Вашему пониманию. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 15:49 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
П.С.М., С goto кажись разобрался. В Си нельзя выпрыгнуть из одной подпрограммы в другую. В рамках одной подпрограммы прыжок не противоречит логики. Я прыгаю на какую нибудь строку с кодом и дальше выполняю всё с этой строки не возвращаясь больше никогда к месту с которого прыгнул. В gt.m если прыгать в пределах одной подпрограммы то то же так, а вот если прыгать из одной подпрограммы в другую (что в Си невозможно) то тогда всё по другому, закончатся строки кода в подпрограмме со строки куда я прыгнул и я вернусь к месту вызова подпрограммы из которой выпрыгивал и опять пойду выполнять строка за строкой код до самого конца первой подпрограммы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 16:08 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567а вот если прыгать из одной подпрограммы в другую Если уж себя не жалеете, пожалейте тех, кто будет работать после Вас. Ну не верю я, что у Вас такая логика программы, что без GoTo не обойтись. Ну ладно еще в рамках какой-нибудь небольшой программки используются переходы по GoTo, где видны все переходы на одном экране (хотя и здесь можно без GoTo обойтись). Но переходы через GoTo еще и по другим программам, это тот случай, из-за которого и предали GoTo анафеме :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 16:21 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
П.С.М., да я раньше не мог понять почему так ругают goto. Мне казалось наоборот goto помогает. (Кстати если посмотреть на условия if, else и циклы на уровне ассемблера, то в начале будет проверка условия, а потом в зависимости как это условие выполнилось прыжок на определённый адрес, а если это цикл то ещё прыжок обратно и это столько раз, сколь итераций цикла. ) Если бы при прыжке из одной подпрограммы в другую не было возврата в место где начала выполняться вызванная подпрограмма (выпрыгнули из подпрограммы и забыли про неё и место где она была вызвана, что к ней возвращаться мы для этого и выпрыгиваем из неё, что бы начать выполнение совсем другого кода) то тогда бы goto не был бы так запутан, а наоборот было бы всё понятно и goto был бы только в помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 16:44 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567условия if, else и циклы на уровне ассемблера ... прыжок на определённый адрес Аналогичным образом можно писать программы и на М. Только прыжки, в отличии от языка ассемблера, совершаются не на адрес, а на метку. Как правило, такой подход к написанию программ (организация циклов и ветвлений через goto), встречается только в старых программах. В новых программах все же лучше такой подход не использовать (ИМХО). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 18:26 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567, В общем-то M(UMPS) может показаться языком со странной философией, особенно если пытаться изучать его методом тыка, ничего не читая. А почитать сейчас есть что, и даже по-русски . 30 лет назад язык поражал своим аскетизмом, возможностью минимальными средствами выразить многое ("запрограммировать что угодно, даже ветер в голове"), сохраняя достаточный уровень абстракции и читабельности программ. Некоторые программные комплексы на MUMPS имеют 20-30 летнюю историю (разве что интерфейс обновился). Задумайтесь, если бы их авторы писали спагетти-код, вряд ли бы они столько прослужили - их бы просто никто не смог сопровождать. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2015, 00:16 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Alexey Maslov, Эту книгу купила организация, я её сейчас читаю и пробую на примерах маленькие куски кода. У меня в программировании очень небольшой опыт, но всё равно были моменты в которых приходилось использовать бесконечные циклы с возможными вариантами - (по условиям) выхода из него. Может это конечно не правильно так как есть опасность сделать ошибку и программа при исполнении уйдёт в бесконечный цикл, что приведёт к её зависанию. Но иногда надо выпрыгнуть и из цикла с конечным числом итераций, а как это сделать не понятно. В книге написано: "Если при выполнении команды GOTO действовал контекст цикла, то он отменяется. Контекст стека полностью сохраняется. Вызываемый код может вызвать команду quit, которая вернёт управление." То есть мы вернёмся обратно в цикл. К goto вставленной в одной строке for обращение идёт только после выполнения всех строк в блоке за одну итерацию, а как быть если необходимо провести проверку и выйти по условию в середине блока. По книге получается что выйти можно, но только когда будет команда quit опять будет возврат на следующую строку в этом блоке откуда вышел, а если надо выйти без возврата, то как быть тогда. Например такой код:prog7 f i=0:1:10 d.. . w !,i . g:i=5 met1 w !,"1111" met1 w !,"2222" qДаёт такой результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Как быть в таком случае? Вот такой код работает как задумывалось:prog7 f i=0:1:10 g:i=5 met1 d.. . w !,i w !,"1111" met1 w !,"2222" qВот результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Например вот такой код надо выйти в середине цикла и больше в цикл не возвращаться:prog7 f i=0:1:10 d.. . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i . g:i=5 met1 . s i=i+1 . w !,i w !,"1111" met1 w !,"2222" qВыйти на совсем не получается, мы возвращаемся, вот результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
f i=0:1:10 g:i=5 met1 d.. . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i . s i=i+1 . w !,i w !,"1111" met1 w !,"2222" qВот результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
В Си выпрыгнул и всё, а в MUMPS не понятно как это осуществить. После "d" две точки - это два пробела. У меня в редакторе они точками другого цвета пишутся, когда копировал получилось что скопировалось точками. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2015, 11:18 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567Например вот такой код надо выйти в середине цикла и больше в цикл не возвращаться:П.С.М. Вы можете вызвать не одну подпрограмму, а многоЯ когда писал свой ответ, наверное как то не очень точно вложил в него смысл. Дополню: Вы можете вызвать не одну подпрограмму, а много чего еще, не только процедуры, но и команды. Вы можете добавить, после выполнения Вашей процедуры, и другие команды/вызовы. Например, можете добавить выход по условию или переход по нужной метке. Но! Лучше все же выход. Не используйте goto! DAiMor уже приводил пример: set q=0 for i=1:1 do quit:q . write !,i . set:i=5 q=1Здесь, как Вы видите, после вызова процедуры идет команда quit с условием. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2015, 12:42 |
|
Какая то чертовщина с этим gt.m
|
|||
---|---|---|---|
#18+
Виталийv4567Такой вариант то же не помогает:prog7 f i=0:1:10 g:i=5 met1 d.. . w !,i ;0 . s i=i+1 . w !,i ;1 . s i=i+1 . w !,i ;2 . s i=i+1 . w !,i ;3 . s i=i+1 . w !,i ;4 . s i=i+1 . w !,i ;5 . s i=i+1 . w !,i ;6 w !,"1111" met1 w !,"2222" qВот результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
f i=0:1:10 g:i=5 met1 d.. на f i=0:1:10 g:i>=5 met1 d.. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2015, 12:52 |
|
|
start [/forum/topic.php?fid=39&msg=38880174&tid=1556727]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
167ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
73ms |
get tp. blocked users: |
2ms |
others: | 239ms |
total: | 529ms |
0 / 0 |