将UCI Lisp循环适配到普通lisp上

问题描述 投票:0回答:1

你好,我正在将下面的UCI lisp代码改编成通用lisp。

这是原函数。

(DE MATCH-ARGS (PAT-ARGS CONST BINDING-FORM)
  (LOOP ((INITIAL PAT-ARG NIL CONST-VAL NIL)
         (WHILE (SETQ PAT-ARG (POP PAT-ARGS)))
         (DO (SETQ CONST-VAL (FILLER:ROLE (ROLE:PAIR PAT-ARG) CONST)))
         (WHILE (SETQ BINDING-FORM
                      (MATCH (FILLER:PAIR PAT-ARG)
                             CONST-VAL
                             BINDING-FORM)))
         (RESULT BINDING-FORM]

这是我现在改编的函数

(defun match-args  (pat-args const binding-form)
    (loop (initial pat-arg nil const-val nil)
          (while (setq pat-arg (pop pat-args)))
          do (setq const-val (filler/role (role/pair pat-arg) const))
          (while (setq binding-form
                    (match (filler/pair pat-arg)
                           const-val
                           binding-form)))
          (result binding-form)))

这是它显示的错误

*** - LOOP: illegal syntax near (INITIAL PAT-ARG NIL CONST-VAL NIL) in
       (LOOP (INITIAL PAT-ARG NIL CONST-VAL NIL) (WHILE (SETQ PAT-ARG (POP PAT-ARGS))) DO
        (SETQ CONST-VAL (FILLER/ROLE (ROLE/PAIR PAT-ARG) CONST))
        (WHILE (SETQ BINDING-FORM (MATCH (FILLER/PAIR PAT-ARG) CONST-VAL BINDING-FORM)))
        (RESULT BINDING-FORM))

请帮助我 Match、fillerrole、fillerpair和rolepair都是自定义函数。

common-lisp clisp
1个回答
0
投票

我想说它看起来像这样。

(defun match-args (pat-args const binding-form)
  (loop for pat-arg in pat-args
        for const-val = (filler/role (role/pair pat-arg) const)
        do (setq binding-form
                 (match (filler/pair pat-arg)
                   const-val
                   binding-form))
        while binding-form
        collect binding-form))

如果你能展示这些函数的来源(或者至少是它们的协议)和输入参数的例子,那会更好。

© www.soinside.com 2019 - 2024. All rights reserved.