cuốn sách gpt4 ai đã làm

nối thêm - Danh sách LISP mà không nối thêm và in hai lần

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 19:03:02 29 4
mua khóa gpt4 Nike

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ì đó.

câu trả lời hay nhất

1.) Tương tựstr + "d"Không có đột biếnstrTrong 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ạilà 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)

Về việc nối thêm - Danh sách LISP không nối thêm và in hai lần, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/46143225/

29 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress