。공부 。

[JESS] Jess deffunction (함수선언)

kyoe 2008. 7. 8. 18:09
제스에서 사용자함수를 만들기 위해서 deffunction문을 앞에 써준뒤 함수명을 기능에 맞게 부여한뒤 사용하면 되는데 이역시 사용하는 방식을 일반함수와 비슷합니다.

2. 큰수를 구하는 함수
(deffunction test_fct(?x ?y)   
    (if(> ?x ?y)then
        (return ?x)
        else
        (return ?y)
        )
)
(printout t"MAX : " (test_fct 100 200) crlf)
어떤가요 함수 선언시 앞에 deffunction문이 붙는거이외에는 일반 저희가 선언할때랑 비슷하죠?
다만 제스에서는 return이 생략되도 ?x 값이나 ?y값을 리턴할수 있습니다.
(if(> ?x ?y)then
        ?x
        else
        ?y
        )
이런식으로 생략되도 ?x 와 ?y값은 리턴됩니다.

3. 리스트를 이용한 함수, multifield 변수
(deffunction show-list(?data1 ?data2 $?datas)
    (bind ?list-num 0)
    (bind ?com-list(create$ ?data1 ?data2 ?datas))
    (foreach ?com-data ?com-list
        (printout t " "(++ ?list-num) ":" ?com-data)
        )
    (printout t crlf)
    )

(show-list 모니터)       ; 에러발생
(show-list 모니터 본체)
(show-list 모니터 본체 스피커)
(show-list 모니터 본체 스피커 키보드 마우스)
show-list 함수를 선언한뒤 매개변수로 3개의 값을 받고 있네요
여기서 눈여겨 봐야 할 부분은 $?datas 이부분입니다.
개변수 앞에 '$'가 붙으면 multifield 변수로써 쓰여지게 됩니다.
여기셔 multifield변수란 위의 show-list 함수에서 3개의 매개변수를 받을수 있게끔되어 있지만 multifield변수를 사용하면 3개이상의 매개변수를 받을수 있게 되는것입니다.
또한 함수호출시 2개의 매개변수만 넘겨주게 되면 multifield변수인 $?datas는 아무값도 없는값이 되므로 2개의 매개변수만 넘겨주어도 에러가 나지 않지만
여기서 한개의 매개변수만 넘겨주게 되면 ?data2변수에 값이 지정되지 않았으므로 에러가 발생한다.

[실행결과]
Jess reported an error in routine show-list
    while executing deffunction show-list
    while executing (show-list 모니터).
  Message: Too few arguments to deffunction show-list.
  Program text: ( show-list 모니터 )  at line 10.

1:모니터 2:본체
1:모니터 2:본체 3:스피커
1:모니터 2:본체 3:스피커 4:키보드 5:마우스