Đến nội dung


Hình ảnh
- - - - -

Quản lý biến trong lisp


  • Please log in to reply
17 replies to this topic

#1 dnhqs

dnhqs

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: 6 (bình thường)

Đã gửi 30 January 2008 - 03:05 PM

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
  • 0

#2 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 30 January 2008 - 05:09 PM

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!
  • 1

#3 dnhqs

dnhqs

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: 6 (bình thường)

Đã gửi 01 February 2008 - 05:12 PM

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
)
  • 0

#4 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 02 February 2008 - 10:15 AM

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!
  • 1

#5 dnhqs

dnhqs

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: 6 (bình thường)

Đã gửi 04 February 2008 - 08:23 AM

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ì
  • 0

#6 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 04 February 2008 - 10:42 AM

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.
  • 0

#7 dnhqs

dnhqs

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: 6 (bình thường)

Đã gửi 13 February 2008 - 10:27 AM

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
  • 0

#8 pfievxd

pfievxd

    biết vẽ spline

  • Members
  • PipPip
  • 94 Bài viết
Điểm đánh giá: 6 (bình thường)

Đã gửi 21 November 2010 - 10:26 PM

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?!
  • 0

#9 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 26 February 2011 - 12:20 AM

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
  • 0

#10 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 26 February 2011 - 01:19 AM

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 ạ. <_<
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#11 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 26 February 2011 - 08:36 AM

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 :">
  • 3

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#12 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 26 February 2011 - 01:06 PM

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.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#13 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 26 February 2011 - 01:35 PM

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
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#14 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 26 February 2011 - 01:41 PM

(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é
  • 0

#15 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 26 February 2011 - 01:49 PM

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.
  • 0

#16 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 26 February 2011 - 01:58 PM

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))

  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#17 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 26 February 2011 - 02:25 PM

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:
  • 0

#18 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 27 February 2011 - 12:03 PM

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


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.