Chuyển đến nội dung
Diễn đàn CADViet
baohiepkt

các bác giúp mình dùng hàm vl-remove-if với

Các bài được khuyến nghị

ví dụ mình có 1 list như sau: ((a 1) (a 20) (1 30))

các bác júp mình tạo list mới: ((a 21) (1 30))

mình đã thử dùng hàm vl-remove-if mà không thể làm đuợc, các bác xem giúp mình nhé!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

ví dụ mình có 1 list như sau: ((a 1) (a 20) (1 30))

các bác júp mình tạo list mới: ((a 21) (1 30))

mình đã thử dùng hàm vl-remove-if mà không thể làm đuợc, các bác xem giúp mình nhé!

Bạn phải nêu trường hợp tổng quát. Chứ chỉ mỗi chuyện chuyển list 1 thành thành list 2 thì... thủ công nhanh hơn nhiều.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

ví dụ mình có 1 list như sau: ((a 1) (a 20) (1 30))

các bác júp mình tạo list mới: ((a 21) (1 30))

mình đã thử dùng hàm vl-remove-if mà không thể làm đuợc, các bác xem giúp mình nhé!

Bạn dùng hàm vl-remove chứ không phải vl-remove-if.

Cách làm (vl-remove '(a 1) '((a 1) (a 20) (1 30))) thì kết quả trả nề là ((a 20) (1 30))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Ý bạn chủ topic là tìm các sub list có car bằng nhau, sau đó cộng giá trị cadr lại, xoá các sublist cũ đi, đồng thời ghi list tổng vào list ban đầu. Việc này chỉ có 1 phần nhỏ dùng đến vl-remove-if thôi

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn dùng hàm vl-remove chứ không phải vl-remove-if.

Cách làm (vl-remove '(a 1) '((a 1) (a 20) (1 30))) thì kết quả trả nề là ((a 20) (1 30))

mình làm thế này thì sai ở đâu mà không đuợc thế bạn:

(vl-remove-if '(lambda (x) (= (car x) A)) '((a 1) (a 20) (1 30)))

 

thank!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

mình làm thế này thì sai ở đâu mà không đuợc thế bạn:

(vl-remove-if '(lambda (x) (= (car x) A)) '((a 1) (a 20) (1 30)))

thank!

làm lambda bạn định nghĩa bên trên sẽ tìm tất cả những thằng nào có giá trị đầu tiên = a để cung cấp cho hàm vl-remove-if. 2 thằng đầu tiên thỏa mãn vì thế sẽ bị loại bỏ.kết quả còn lại 1 thằng duy nhất là (1 30)

anh em đang đoán mò cái kết quả bạn muốn thu đuợc đấy. bạn muốn nó là ((a 20) (1 30)) hay ((a 21) (1 30)) đúng như bài 1 của bạn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

làm lambda bạn định nghĩa bên trên sẽ tìm tất cả những thằng nào có giá trị đầu tiên = a để cung cấp cho hàm vl-remove-if. 2 thằng đầu tiên thỏa mãn vì thế sẽ bị loại bỏ.kết quả còn lại 1 thằng duy nhất là (1 30)

.....

Bạn đã thử chay chưa?

(vl-remove-if '(lambda (x) (= (car x) A)) '((a 1) (a 20) (1 30)))

 

(= (car x) A) => Chẳng có anh nào thỏa mãn cả.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

mình làm thế này thì sai ở đâu mà không đuợc thế bạn:

(vl-remove-if '(lambda (x) (= (car x) A)) '((a 1) (a 20) (1 30)))

 

thank!

Bạn đổi thành như thế này xem sao :

 

(vl-remove-if '(lambda (x) (= (car x) 'a)) '((a 1) (a 20) (1 30)))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn đổi thành như thế này xem sao :

 

thank bạn ketxu nhiều nhé! mình mới tập các lệnh của lisp nên không hiểu về nguyên tắc, mình thử lại rồi, được ngon lành!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

minh muon dung vl-remove-if với hai đối tượng như mẫu sau tại sao lại không đuợc bạn nhỉ:

(vl-remove-if '(lambda (x y) (= (car x) (car y))) '((a 1) (a 20) (1 30)))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×