Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
dnhqs

Quản lý biến trong lisp

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

Có ai chỉ giúp mình làm thế nào để quản lý được biến trong các chương trình của lisp.

Cụ thể là: - khi mình viết một chương trình cứ phát sinh biến nào thì cứ đưa vào, sau này làm sao để qui tập chúng về để khai chúng là biến địa phương

- làm thế bào để biết được biến đó mình đã dùng ở đoạn trên rồi

- làm thế nào để khỏi trùng biến của hệ thống, cũng như biến toàn cục

Lại có ai chỉ giúp : làm thế nào để tra cứu nhanh các hàm cũng như cách sử dụng hàm

Cám ơn ơi là cám ơ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
Có ai chỉ giúp mình làm thế nào để quản lý được biến trong các chương trình của lisp.

Cụ thể là: - khi mình viết một chương trình cứ phát sinh biến nào thì cứ đưa vào, sau này làm sao để qui tập chúng về để khai chúng là biến địa phương

- làm thế bào để biết được biến đó mình đã dùng ở đoạn trên rồi

- làm thế nào để khỏi trùng biến của hệ thống, cũng như biến toàn cục

Lại có ai chỉ giúp : làm thế nào để tra cứu nhanh các hàm cũng như cách sử dụng hàm

Cám ơn ơi là cám ơn

1) Biện pháp cơ bản để quản lý biến là chia nhỏ chương trình ra một cách hợp lý. Theo kinh nghiệm bản thân ssg, một function không nên dài quá 1 trang hiển thị trên màn hình. Bạn dò từ trên xuống dưới, ở những chỗ có (setq ...), sẽ khó mà sót "chú" nào!

2) Bạn dùng Visual Lisp Editor, vào Tools - Environment Options - General Options - Diagnostic, chọn "Report statistics during syntax checking". Khi check code: Tools - Check text in editor, trong cửa sổ Built Output sẽ có thống kê đầy đủ Global Variables của tất cả các functions trong file lsp. Bạn muốn giữ cái nào là global tuỳ ý, còn lại chuyển chúng thành local.

3) Hãy học cách dùng Developer Documentation bạn mới có thể nghiên cứu sâu về Lisp được (đừng nhầm lẫn với Help bình thường của Acad). Ví dụ, đối với Cad2007: Help - Additional Resources - Developer Help. Trong đó:

- Các functions xếp theo ABC: Autolisp Reference - AutoLisp Functions

- Các funtions xếp theo chức năng: AutoLisp Developer's Guide - Appendixes

4) Về system variables thì topic bên dưới đã đề cập rồi, cũng trong Help thôi chứ ở đâu nữa!

  • 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
1) Biện pháp cơ bản để quản lý biến là chia nhỏ chương trình ra một cách hợp lý. Theo kinh nghiệm bản thân ssg, một function không nên dài quá 1 trang hiển thị trên màn hình. Bạn dò từ trên xuống dưới, ở những chỗ có (setq ...), sẽ khó mà sót "chú" nào!

2) Bạn dùng Visual Lisp Editor, vào Tools - Environment Options - General Options - Diagnostic, chọn "Report statistics during syntax checking". Khi check code: Tools - Check text in editor, trong cửa sổ Built Output sẽ có thống kê đầy đủ Global Variables của tất cả các functions trong file lsp. Bạn muốn giữ cái nào là global tuỳ ý, còn lại chuyển chúng thành local.

3) Hãy học cách dùng Developer Documentation bạn mới có thể nghiên cứu sâu về Lisp được (đừng nhầm lẫn với Help bình thường của Acad). Ví dụ, đối với Cad2007: Help - Additional Resources - Developer Help. Trong đó:

- Các functions xếp theo ABC: Autolisp Reference - AutoLisp Functions

- Các funtions xếp theo chức năng: AutoLisp Developer's Guide - Appendixes

4) Về system variables thì topic bên dưới đã đề cập rồi, cũng trong Help thôi chứ ở đâu nữa!

quá hay cám ơn nhiều

ssg cho hỏi nhé mình muốn viếc các chương trình con nhưng mà khốn khổ không biết làm sao để xuất nó ra

ví dụ:

(defun vidu (a / b c d e f ...diem); các loại dữ liệu khác nhau

(setq b (getreal "\n Nhap b ")

c (getreal "\n Nhap c ")

e (getreal "\n Nhap e ")

diem (getpoint "\n Nhap diem ")

 

;............

f (+ a b c d e) ;.....

 

)

)

(defun c:layvd ()

; lay a, b, c, d, e, ...diem của chương trình con nói trê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
ssg cho hỏi nhé mình muốn viếc các chương trình con nhưng mà khốn khổ không biết làm sao để xuất nó ra

Local Variables (biến địa phương), được đặt sau dấu "/" (không khai báo gì cả thì mặc nhiên chúng là Global), sẽ được giải phóng khỏi bộ nhớ máy tính sau khi thực hiện function, nghĩa là toàn bộ các biến trên đều nhận giá trị nil. Bạn muốn dùng các giá trị để làm việc gì đó thì không được khai báo là Local trong function "vidu".

Xét đoạn chương trình chính dưới đây, sau khi thực hiện function (vidu), bạn nhận được toàn bộ các giá trị x, y, z, tong và diem. Khi kết thúc, nếu bạn muốn giải phóng các biến trên thì đặt chúng là Local Variables của C:LAYVD

 

;;;---------------------------------------------
(defun vidu ()
(setq
   x (getreal "\n Nhap x: ")
   y (getreal "\n Nhap y: ")
   z (getreal "\n Nhap z: ")
   tong (+ x y z)
   diem (getpoint "\n Nhap diem: ")
)
)
;;;---------------------------------------------
(defun c:layvd (/ x y z tong diem)
(vidu)
;;;Vi du minh hoa su dung ket qua nhan duoc
(command "circle" diem 10)
(alert
   (strcat
       "\nx = " (rtos x)
       "\ny = " (rtos y)
       "\nz = " (rtos z)
       "\nTong = x + y + z = " (rtos tong)
   )
)
)
;;;---------------------------------------------

 

Lưu ý: ký tự b cạnh dấu ) post lên diễn đàn sẽ bị đổi thành icon -> không nên dùng ký tự b để đặt tên biến!

  • 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
Local Variables (biến địa phương), được đặt sau dấu "/" (không khai báo gì cả thì mặc nhiên chúng là Global), sẽ được giải phóng khỏi bộ nhớ máy tính sau khi thực hiện function, nghĩa là toàn bộ các biến trên đều nhận giá trị nil. Bạn muốn dùng các giá trị để làm việc gì đó thì không được khai báo là Local trong function "vidu".

Xét đoạn chương trình chính dưới đây, sau khi thực hiện function (vidu), bạn nhận được toàn bộ các giá trị x, y, z, tong và diem. Khi kết thúc, nếu bạn muốn giải phóng các biến trên thì đặt chúng là Local Variables của C:LAYVD

 

;;;---------------------------------------------
(defun vidu ()
(setq
   x (getreal "\n Nhap x: ")
   y (getreal "\n Nhap y: ")
   z (getreal "\n Nhap z: ")
   tong (+ x y z)
   diem (getpoint "\n Nhap diem: ")
)
)
;;;---------------------------------------------
(defun c:layvd (/ x y z tong diem)
(vidu)
;;;Vi du minh hoa su dung ket qua nhan duoc
(command "circle" diem 10)
(alert
   (strcat
       "\nx = " (rtos x)
       "\ny = " (rtos y)
       "\nz = " (rtos z)
       "\nTong = x + y + z = " (rtos tong)
   )
)
)
;;;---------------------------------------------

 

Lưu ý: ký tự b cạnh dấu ) post lên diễn đàn sẽ bị đổi thành icon -> không nên dùng ký tự b để đặt tên biến!

cám ơn ssg. ý mình là làm sao để giải phóng bọn biến địa phương để các chương trình khác khỏi nhận nhầm chúng ấy tại vì mình sợ nhiều biến quá thì lung tung. lâu nay mình cứ viết bừa gặp đâu là cho biến vào đó nên nhiều lúc loạn cả. có cả cái lisp dài đến mươi trang mà chỉ có 1 function (bạn thấy mình có "thiên tài" không) hì hì

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
cám ơn ssg. ý mình là làm sao để giải phóng bọn biến địa phương để các chương trình khác khỏi nhận nhầm chúng ấy tại vì mình sợ nhiều biến quá thì lung tung. lâu nay mình cứ viết bừa gặp đâu là cho biến vào đó nên nhiều lúc loạn cả. có cả cái lisp dài đến mươi trang mà chỉ có 1 function (bạn thấy mình có "thiên tài" không) hì hì

Ssg hiểu ý bạn, và xin góp thêm vài ý:

1) Thất ra thì nhiều chương trình lisp có chung global variables trong một số trường hợp cũng không ảnh hưởng gì nếu như bạn biết cách chủ động điều khiển giá trị của biến ở mọi thời điểm (đặc biệt là ở các thời điểm "nhạy cảm", ví dụ như trước khi đặt các biểu thức điều kiện). Lý do chính của việc dùng local variables là không nên chiếm dụng tài nguyên hệ thống một cách không cần thiết.

2) Trong ví dụ của bạn, việc tách function vidu ra khỏi function C:Layvd chỉ mang tính hình thức vì thực chất nó chỉ là một "trích đoạn" của chương trình chính. Hiệu quả mà nó mang lại không được bao nhiêu. Bạn chỉ nên làm kiểu này khi chương trình chính C:Layvd quá dài, hoặc có nhiều câu lệnh điều kiện phức tạp.

3) Bạn hãy quan tâm nhiều hơn đến cách lập và sử dụng các functions có arguments (đối số). Đây là kỹ năng cực kỳ quan trọng của lập trình viên. Nếu có thể, cố gắng nâng chúng lên tầm tổng quát, mang tính public, dùng chung cho nhiều chương trình khác nhau.

Ví dụ: (defun dtr(x) (/ (* x pi) 180)), đổi độ sang radian, là một function mang tính public điển hình.

4) Nếu được, bạn hãy post lên một chương trình lisp mà bạn cảm thấy không ưng ý vì nó dài dòng, luộm thuộm. Mình sẽ biên tập lại để minh họa thêm cho các ý đã nói trê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
Ssg hiểu ý bạn, và xin góp thêm vài ý:

1) Thất ra thì nhiều chương trình lisp có chung global variables trong một số trường hợp cũng không ảnh hưởng gì nếu như bạn biết cách chủ động điều khiển giá trị của biến ở mọi thời điểm (đặc biệt là ở các thời điểm "nhạy cảm", ví dụ như trước khi đặt các biểu thức điều kiện). Lý do chính của việc dùng local variables là không nên chiếm dụng tài nguyên hệ thống một cách không cần thiết.

2) Trong ví dụ của bạn, việc tách function vidu ra khỏi function C:Layvd chỉ mang tính hình thức vì thực chất nó chỉ là một "trích đoạn" của chương trình chính. Hiệu quả mà nó mang lại không được bao nhiêu. Bạn chỉ nên làm kiểu này khi chương trình chính C:Layvd quá dài, hoặc có nhiều câu lệnh điều kiện phức tạp.

3) Bạn hãy quan tâm nhiều hơn đến cách lập và sử dụng các functions có arguments (đối số). Đây là kỹ năng cực kỳ quan trọng của lập trình viên. Nếu có thể, cố gắng nâng chúng lên tầm tổng quát, mang tính public, dùng chung cho nhiều chương trình khác nhau.

Ví dụ: (defun dtr(x) (/ (* x pi) 180)), đổi độ sang radian, là một function mang tính public điển hình.

4) Nếu được, bạn hãy post lên một chương trình lisp mà bạn cảm thấy không ưng ý vì nó dài dòng, luộm thuộm. Mình sẽ biên tập lại để minh họa thêm cho các ý đã nói trên.

Trước mắt chân thành cảm ơn ssg và chúc ssg năm mới vạn sự như ý (hôm nay mình mới zô mạ lại)

Thực ra ssg chưa hiểu ý mình hỏi. ý mình là chổ giải phóng được biến địa phương, nhưng vẫn lấy được hàng loạt giá trị được gói vào biến a (trong ví dụ của mính ý) của chương trình chính. Còn những nội dung khác mình không hỏi nhưng ssg trả lời làm mình sáng ra rất nhiều, cám ơn ssg

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

Huhu, đọc bài của các bác thì hiểu mà sao e chưa bao h làm chủ được việc quản lý mấy cái biến cục bộ thế này :iluvyousmiley: , cứ để không thì ko sao chứ khai báo biến cục bộ là thế nào cũng báo lỗi too fews arguments!!!!!!!!

Ơ sorry các bác, vừa than xong thì làm được, có thể lỗi là do xung đột giữa lisp đã sửa và lisp chưa sửa chăng?!

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 có một vấn đề nảy sinh trong quá trình viết lisp là làm sao để biết được và lấy được giá trị của các biến toàn cục mà trong quá trình viết lisp mình đã đặt (dùng tới nó và hiện đang lưu giá trị trong bản Cad đang mở). Ví dụ: (defun C:text() (setq A ....)). Vì biến A là biến toàn cục nên nó sẽ lưu trong môi trường bản vẽ. Vậy có cách nào để lấy được giá trị biến A và các biến tương tự A mà không cần biết biến A tên chính xác như thế nào không? (Vì thực tế có rất nhiều biến tương tự A mà mình không nhớ hết được). Mong các bác có cao kiến gỡ rối cho em vụ này với. Cám ơn các bác

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 có một vấn đề nảy sinh trong quá trình viết lisp là làm sao để biết được và lấy được giá trị của các biến toàn cục mà trong quá trình viết lisp mình đã đặt (dùng tới nó và hiện đang lưu giá trị trong bản Cad đang mở). Ví dụ: (defun C:text() (setq A ....)). Vì biến A là biến toàn cục nên nó sẽ lưu trong môi trường bản vẽ. Vậy có cách nào để lấy được giá trị biến A và các biến tương tự A mà không cần biết biến A tên chính xác như thế nào không? (Vì thực tế có rất nhiều biến tương tự A mà mình không nhớ hết được). Mong các bác có cao kiến gỡ rối cho em vụ này với. Cám ơn các bác

Diễn đạt lòng vòng khó hiểu. Nói chính xác và ngắn gọn thì Nataca muốn tìm danh sach tất cả các biến toàn cục đang tồn tại trong bản vẽ các bác ạ. <_<

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

Diễn đạt lòng vòng khó hiểu. Nói chính xác và ngắn gọn thì Nataca muốn tìm danh sach tất cả các biến toàn cục đang tồn tại trong bản vẽ các bác ạ. <_<

 

Nếu thế thì chắc là thằng này

 

(defun c:listnums ( / atoms)
(if
(setq atoms
(apply 'append
(mapcar
'(lambda (x) (if (numberp (eval (read x))) (list x)))
(atoms-family 1)
)
)
)
(foreach x (acad_strlsort atoms)
(princ (strcat "\n" x " = "))
(princ (eval (read x)))
)
(princ "\nNo numbers found in atoms-family.")
)
(princ)
)

Hàm atoms-family có trong help :">

  • Vote tăng 3

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

Ketxu tiến bộ thật là đáng nể.

Tiếp nhé. Cad cung cấp cho người dùng 10 biến User để lưu vào bản vẽ, nhưng chúng chỉ chấp nhận 5 biến giá trị là Real và 5 biến giá trị integer.

Giờ mình muốn lưu 1 list vào 1 biến lưu trong bản vẽ, nghĩa là biến này vẫn tồn tại trong bản vẽ khi ta tắt bản vẽ đi.

List đó có thể gồm các phần tử: string, real, integer...

Cái này rất cần để viết các phần mềm lớn. Mình tin là có thể làm được vì Nova đã làm được điều tương tự. tuy nhiên chưa mò được.

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

E nghĩ bác đang đề cập tới Xdata - Dictionary (các hàm vlax-ldata-* )

Ví dụ của bác GiaBach

Các giá trị lưu trong "từ điển" đi kèm trong file bản vẽ và cũng có thể truy xuất từ các bản vẽ khá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

(atoms-family)

Đúng rồi. Mình quên mất là đã từng sử dụng hàm atoms-family để lấy các hàm ACET-*. Cám ơn ketxu 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

E nghĩ bác đang đề cập tới Xdata - Dictionary (các hàm vlax-ldata-* )

Ví dụ của bác GiaBach

Các giá trị lưu trong "từ điển" đi kèm trong file bản vẽ và cũng có thể truy xuất từ các bản vẽ khác

- Xdata thì có một cái dở là phải gắn vào đối tượng trong bản vẽ -> lỡ tay xóa là toi

- Dictionary thực ra là từ điển chứa đối tượng. Các dữ liệu vẫn liên quan đến đối tượng. Nếu xóa đối tượng, Purge bản vẽ vẫn có thể bị mất.

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

E đoán Dictionary đi kèm với các thiết đặt đặc biệt của bản vẽ bác ạ, vì e đã thử tạo 1 từ điển trong 1 file hoàn toàn trống, sau đó purge đủ kiểu, sau đó lưu lại, và nó vẫn còn bác ạ ^^

(entget(namedobjdict))

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 vừa thử lại hàm atoms-family. Rất nhiều thông tin hữu ích. Tuy nhiên để phân loại kết quả trả về quả là khó khăn (VD: Hàm của Cad, Hàm của lisp, Biến của Cad, biến của lisp...) Không biết có cách nào lọc được các biến do lisp tạo ra không nữa :blink:

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

E nghĩ bác đang đề cập tới Xdata - Dictionary (các hàm vlax-ldata-* )

Ví dụ của bác GiaBach

Các giá trị lưu trong "từ điển" đi kèm trong file bản vẽ và cũng có thể truy xuất từ các bản vẽ khác

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
Đăng nhập để thực hiện theo  

×