%%HP: T(3)A(R)F(.);
@ @ @  KONTROLA ARGUMENTU
@ Real List|String ENVACHK(Prog function);
@ Real List|String ENVACHK(List args);
\<<
  @ @ @  KONTROLA TYPU FUNKCE
  @ Real Prog ckftype(Prog function);
  @ Real Prog ckftype(Name globalname);
  \<< IF { 5. 6.} OVER TYPE POS
    THEN RCL
    END
    8. OVER TYPE \=/	@	0.|1.	obj
  \>>
  "Function"		@	"Funct	\<< \>>
  \-> ckftype errftxt
  \<<			@	obj
@ Je zadany objekt typu List?
    IF
      DUP		@	obj	obj
      TYPE		@	type	obj
      5.		@	5.	type	obj
      ==		@	1.|0.	obj
    THEN		@ {	{args}
@ Ma seznam argumentu 4 polozky?
      IF
        DUP		@	{args}	{args}
        SIZE		@	size	{args}
        4.		@	4.	size	{args}
        ==		@	1.|0.	{args}
      THEN		@ {	{args}
        DUP		@	{args}	{args}
        1.		@	ifnc	{args}	{args}
        GET		@	func	{args}
@ Ma zadana funkce spravny typ?
        IF
          ckftype EVAL	@	0.|1.	func	{args}
        THEN		@ {	func	{args}
          DROP2
          errftxt
          1.		@	RTN(1)	errtext
        ELSE		@ }{	\<< \>>	{args}
          1.		@	ifnc	\<< \>>	{args}
          SWAP		@	\<< \>>	ifnc	{args}
          PUT		@	{args}
@ Maji zadane pocty spravny typ?
          DUP		@	{args}	{args}
          2.		@	iper	{args}	{args}
          3.		@	irep	iper	{args}	{args}
          SUB		@	{nums}	{args}
          DUP		@	{nums}	{nums}	{args}
          \<< TYPE \>>	@	\<< \>>	{nums}	{nums}	{args}
          MAP		@	{types}	{nums}	{args}
          IF
            \GSLIST	@	0.|N	{nums}	{args}
          THEN		@ {	{nums}	{args}
            DROP2
            "Numbers type"
            1.		@	RTN(1) errtext
          ELSE		@ }{	{nums}	{args}
@ Nejsou zadane pocty <= 0?
            \<< 0. \<= \>>	@	\<< \>>	{nums}	{args}
            MAP		@	{errf}	{args}
            IF
              \GSLIST	@	0.|N	{args}
            THEN	@ {	{args}
              DROP
              "Numbers \<= 0"
              1.	@	RTN(1) errtext
            ELSE	@ }{
@ Maji options spravny typ?
              DUP	@	{args}	{args}
              4.	@	iopt	{args}	{args}
              GET	@	options	{args}
              { 2. 6. }	@	{2. 6.}	options	{args}
              SWAP	@	options	{2. 6.}	{args}
              TYPE	@	topt	{2. 6.}	{args}
              IF
                POS	@	0.|.2	{args}
              THEN	@ {	{args}
                0.	@	RTN(0)	{args}
              ELSE	@ }{	options	{args}
                DROP
                "Options type"
                1.	@	RTN(1) errtext
              END	@ }
            END		@ }
          END		@ }
        END		@ }
      ELSE		@ }{	{args}
        DROP
        "Arguments count"
        1.		@	RTN(1) errtext
      END		@ }
    ELSE		@ }{	func
      IF
        ckftype EVAL	@	0.|1.	\<< \>>
      THEN		@ {	\<< \>>
        DROP
        errftxt
        1.		@	RTN(1) errtext
      ELSE		@ }{	\<< \>>
@ K samotne funkci pridat default hodnoty
        ENVDFLT		@	{args}
        0.		@	RTN(0)	{args}
      END		@ }
    END			@ }
  \>>
\>>
