Tôi mới làm quen với LISP và tôi đang cố gắng làm việc với các câu lệnh điều khiển cho các lớp. Hiện tại, tôi đang cố kiểm tra xem giá trị được chuyển có phải là danh sách hay không và nếu có, hãy thêm chữ cái d vào danh sách.
Đây là mã của tôi:
(kiểm tra không còn tồn tại (L)
(danh sách L)
(cond ((listp L) (nối L (danh sách 'd)))
)
(viết L)
)
(kiểm tra (danh sách 'a' b 'c))
Đầu ra tôi nhận được là:
(ABC)
(ABC)
Nếu tôi thay đổi bài kiểm tra thành:(kiểm tra (xe (danh sách 'a 'b 'c)))
Đầu ra mới tôi nhận được là:
MỘT
MỘT
Hai điều tôi muốn biết là
1.) Nếu bài kiểm tra đầu tiên vượt qua danh sách, tại sao không thêm D vào danh sách?
2.) Tại sao phải in hai lần? Tôi đang sử dụng LISP Works, vì vậy tôi nghĩ nó thực sự có liên quan đến cách nó luôn đưa ra giá trị cuối cùng hoặc thứ gì đó.
1.) Tương tựstr + "d"
Không có đột biếnstr
Trong Java hoặc Python. Nó tạo ra một danh sách mới mà bạn không sử dụng!
>>> str + "d"
'abcd'
>>> str
'abc'
Giống nhau đến điên rồ phải không?
2.) Trong CL trở lại
là biểu thức được đánh giá cuối cùng. REPL in kết quả của từng biểu thức cấp cao nhất tới thiết bị đầu cuối. Python cũng làm điều này:
>>> kiểm tra chắc chắn():
... x = 2 + 3
...in x
... return x
...
>>> kiểm tra()
5
5
gia hạn
Cách thay đổi danh sách tham số. Câu trả lời đơn giản là bạn cần thay đổi cặp tham số cuối cùng:
(kiểm tra defun (l)
(xác nhận (consp 1) (l) "l cần phải là một danh sách không bằng 0. Đã nhận: ~a" l)
(nconc l (danh sách 'd)
(viết l)))
(defparameter *test1* (danh sách 1 2 3))
(defparameter *test1-copy* *test1*)
(kiểm tra *test1*) ; ==> (1 2 3 d) (và in (1 2 3 d))
*test1* ; ==> (1 2 3 d)
*test1-copy* ; ==> (1 2 3 d)
(eq *test1* *test1-copy*) ; ==> t
(Bài kiểm tra '())
** lỗi l cần phải là một danh sách không bằng 0. Đã nhận được: NIL.
(nconc lx)
LÀM (setf (cdr (l cuối cùng)) x)
Nếu bạn cần thay đổi liên kết, thì bạn cần tạo macro:
(kiểm tra defmacro (var)
(assert (symbolp var) (var) "Danh sách cần phải là một liên kết biến. Đã có: ~a" var)
`(chương trình
(khi (listp,var)
(setf ,var (nối thêm ,var (danh sách 'd)))
(viết,var))))
(macroexpand '(testm *test2*))
; ==> (chương trình
; (khi (consp *test2*)
; (setf *test2* (nối *test2* (danh sách 'd))))
; (viết *test2*))
(defparameter *test2* (danh sách 1 2 3))
(defparameter *test2-copy* *test2*)
(testm *test2*) ; ==> (1 2 3 d) (và in (1 2 3 d))
*test2* ; ==> (1 2 3 d)
*test2-copy* ; ==> (1 2 3)
(eq *test2* *test2-copy*) ; ==> không
(defparameter *x* nil)
(testm *x*) ; ==> (d) (và in (d))
*x* ; ==> (d)
(kiểm tra '(1))
** Danh sách lỗi cần phải là một ràng buộc biến Có: '(1)
cách thành ngữ để làm điều này
(kiểm tra defun (danh sách)
(nếu (danh sách khuyết điểm)
(nối thêm danh sách '(d))
danh sách))
(viết (kiểm tra '(1 2 3)))
; ==> (1 2 3 d) (và in (1 2 3 d))
(defparameter *test3* '(1 2 3))
(setf *test3* (kiểm tra *test3*))
*test3* ; ==> (1 2 3 d)
Tôi là một lập trình viên xuất sắc, rất giỏi!