Emacs Lisp 的第二个 child

Second child of an Emacs Lisp

有了这些给我的 emac lisp 定义,我需要得到 (defun operand (n ast)) 的正确结果。目前,第一个 child 像预期的那样工作,但对于第二个 child (操作数 (- n 1) (cadr ast)) 给出第二个 child 作为 (INT_LITERAL pos) 而不是 child 的其余部分 ((INT_LITERAL pos) (77))。不知道从这里去哪里。如您所见,我已经做了一些猜测和测试来修复我的解决方案,但还没有任何效果。根据我的理解,当我的结果为零时,这意味着该框架没有 parent 框架,但我不确定为什么它不打印出整个操作数。

(defun store (offset value alist)
"Insert the value for this offset, replacing the previous value (if any)."
(cond
   ((null alist)             (list (cons offset value)))    ; ((offset . value))
   ((eq offset (caar alist)) (cons (cons offset value) (cdr alist)))
   (t                        (cons (car alist)
                                   (store offset value (cdr alist))))
   )
)

(defun lookup (offset alist)
"Return the value associated with this offset, or raise an error."
(cond
   ((null alist)             (user-error "UNINITIALISED %s" offset) (exit))
   ((eq (caar alist) offset) (cdar alist))
   (t                        (lookup offset (cdr alist)))
   )
)

;;(setq a (store 1 19 (store 0 17 ())))
;; a
;; (setq a (store 2 20 a))
;; (setq a (store 1 29 a))
;; (lookup 3 ())
;; (lookup 3 a)
;;(lookup 1 a)


;;; Accessors for the various fields in an AST node

(defun position (ast)
"The position stored in an AST node"
(cadar ast)
)

(defun kind (ast)
(caar ast)
)


(defun operand (n ast)
;; Your code goes here.
(if (eq n 0)
      (caadr ast) ;;first child
    (operand (- n 1)(cadr ast)) ;;second child
    )
)

;;(operand (- n 1)(cadr (cadr ast))) gives 77 (#o115, #x4d, ?M)
;;(operand (- n 1)(cadr ast)) gives (INT_LITERAL pos)
;;(operand (- n 1) (cadr (cddr ast))) gives nil
;;(operand (- n 1) (cdr (cadr ast))) gives nil
;; (operand (- n 1)(caddr ast)) gives nil
;;(operand (- n 1)(car ast)) gives wrong type argument listp, pos
;;(operand (- n 1)(cdr ast)) gives nil
;;cadadr, cadr, cadddr, cdadr, caddr, car, cdr

;; (setq ast '((PLUS pos) (( (VARIABLE pos) (b 1) ) ((INT_LITERAL pos) (77) ) ) ))
;; (kind ast) = PLUS
;; (position ast) = pos
;; (operand 0 at) = ((VARIABLE pos)(b 1))
;; (kind (operand 0 ast))= VARIABLE
;; (operand 1 ast)= supposed to equal ((INT_LITERAL pos) (77))
;; (kind (operand 1 ast)) = supposed to equal INT_LITERAL

你的问题不容易理解——我相信你可以将所有代码削减到 far 用于这些目的的更小的东西。

目前您正在递归调用 operand,但是 ast 数据不具有该递归所需的嵌套结构,因此事情很快就会崩溃。

我想你只是想要这个?

(defun operand (n ast)
  (nth n (cadr ast)))