TACL Как использовать несколько аргументов

Мне было интересно, есть ли у нас какие-либо эксперты по TACL, которые могли бы помочь мне ответить, вероятно, на очень простой вопрос.

Как вы вводите несколько аргументов в свою рутину.

Это то, что у меня есть на данный момент

[#CASE [#ARGUMENT / VALUE job_id/number /minimum [min_job], maximum [max_job]/
                               otherwise]
   |1|#output Job Number = [job_id]
   |otherwise|
   #output Bad number - Must be a number between [min_job] & [max_job]
   #return
]

Мне сказали, что вам нужно использовать второй оператор #ARGUMENT, чтобы заставить его работать, но мне не повезло заставить его работать. И руководства в формате PDF не очень помогают.

Любые идеи/ответы были бы замечательными

Спасибо.


person Gizmo0    schedule 03.07.2020    source источник


Ответы (3)


Оператор #CASE не требуется, если ваши аргументы позиционные и одного типа (т.е. вы знаете, что вы получаете и в каком порядке). В этом случае вы можете просто использовать последовательность операторов #ARGUMENT для получения аргументов.
В вашем примере #ARGUMENT принимает либо число в диапазоне, либо что-то еще — бит OTHERWISE. Затем оператор #CASE сообщает вам, какой из этих двух вы получили, 1 или 2.

#ARGUMENT может выполнить проверку данных за вас (вы можете узнать вывод некоторых подпрограмм TACL, поставляемых с операционной системой).

Таким образом, вы можете написать что-то вроде этого:
SINK [#ARGUMENT / VALUE job_id/number /minimum [min_job], maximum [max_job]/]

РАКОВИНА просто отбрасывает расширение #ARGUMENT, оно вам не нужно, так как вы принимаете только число и терпите неудачу в противном случае.

person Andy Simpson    schedule 05.07.2020
comment
Ох, хорошо. Раньше я пытался сделать только аргумент, но, должно быть, неправильно отформатировал его, так как продолжал получать сообщение об ошибке. Я могу отдать его назад, когда остальная часть моей рутины будет работать до такой степени, что она будет делать то, что я хочу. - person Gizmo0; 08.07.2020

Я придумал способ, но не знаю, лучший ли это способ сделать это.

Кажется, что во-первых, оператор Argument всегда должен быть в операторе #CASE, поэтому все, что я в основном сделал, это отразило вышеизложенное и просто изменило его для текста, а не для использования целого числа.

Если вы знаете какие-либо другие/лучшие способы, дайте мне знать :)

person Gizmo0    schedule 03.07.2020

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

?TACL ROUTINE

#FRAME

    #PUSH JOB_ID MIN_JOB MAX_JOB
    #SETMANY MIN_JOB MAX_JOB , 1 3
    [#DEF VALID_KEYWORDS TEXT |BODY| THISJOB THATJOB SOMEOTHERJOB]

    [#CASE
        [#ARGUMENT/VALUE JOB_ID/
            NUMBER/MINIMUM [MIN_JOB],MAXIMUM [MAX_JOB]/
            KEYWORD/WORDLIST [VALID_KEYWORDS]/
            STRING
            OTHERWISE
        ]
    | 1         |
        #OUTPUT VALID JOB NUMBER = [JOB_ID]
    | 2         |
        #OUTPUT VALID KEYWORD = [JOB_ID]
    | 3         |
        #OUTPUT VALID STRING = [JOB_ID]
    | OTHERWISE |
        #OUTPUT NOT A NUMBER, KEYWORD, OR A STRING
        #OUTPUT MUST BE ONE OF:
        #OUTPUT A NUMBER IN THE RANGE OF: [MIN_JOB] TO [MAX_JOB]
        #OUTPUT A KEYWORD IN THIS LIST: [VALID_KEYWORDS]
        #OUTPUT OR A STRING OF CHARACTERS
        #RETURN
    ]

    #OUTPUT
    #OUTPUT NOW WE ARE USING ARGUMENT [JOB_ID] !!!
    TIME

#UNFRAME
person Mark Poriss    schedule 05.10.2020