Ví dụ: #'functionname
, là cần thiết?# có nghĩa là gì trong LISP
Trả lời
# 'functionName trong Common Lisp
Common Lisp và một số thổ ngữ Lisp khác có nhiều hơn một namespace. Ở đây, các hàm cho hàm và giá trị khác nhau. Để có được chức năng giá trị của một tên, chúng ta cần phải viết:
(function functionname)
Kể từ đó là một chút thời gian để viết, có một ký hiệu ngắn hơn:
#'functionname
để hiển thị hiệu ứng thấy này:
(let ((foo 42))
(flet ((foo() 'bar))
(list foo (function foo) #'foo (foo))))
Trên định nghĩa một địa phương biếnFOO
và hàm cục bộFOO
. Tuyên bố danh sách trả về giá trị của FOO
, thì giá trị chức năng của foo
sử dụng (function ...)
ký hiệu, sau đó cùng sử dụng các ký hiệu tay ngắn và sau đó giá trị của thực sự gọi hàm FOO
.
(function foo)
và #'foo
là cùng một khái niệm, nhưng được viết khác nhau. Cả hai đều đề cập đến hàm từ vựng cục bộ có tên là FOO
. FOO
được giới thiệu dưới dạng FLET
dưới dạng hàm địa phương .
Các Lisp REPL trả về một cái gì đó như thế này:
(42 #<function FOO 4060008224> #<function FOO 4060008224> BAR)
Trên cho thấy mục đầu tiên thực sự là giá trị của biến FOO
và hai mục tiếp theo là chức năng đánh giá cao, hàm ràng buộc đến FOO
. Mục cuối cùng là biểu tượng BAR
, như được trả về từ hàm gọi (FOO)
.
Việc tách các không gian tên này cho các giá trị thông thường và các giá trị hàm có mặt trong Common Lisp, Emacs Lisp và ISLisp. Các phương ngữ Lisp khác như Scheme không có sự tách biệt đó. Trong lược đồ một tên chỉ có thể biểu thị một giá trị.
# ký tự.
Ký tự #
được sử dụng để giới thiệu cú pháp đặc biệt trong biểu thức s. Dưới đây là một số ví dụ:
#'functionname -> (function functionname)
#(1 2 3) -> the vector of the elements 1 2 3
#c(1 2) -> a complex number
#xFFFF -> a hex number
#b1111 -> a binary number
và hơn thế nữa. #
được gọi là ký tự macro gửi đi.
ANSI Common Lisp HyperSpec mô tả các ký tự #
trong Section 2.4.8 Sharpsign.
Lisp thường có thể đã sử dụng cú pháp khác nhau cho vectơ. Nói [1 2 3]
. Nó cũng có thể sử dụng một cú pháp khác cho các số phức. Một cái gì đó như {1 2}
. Nhưng nó không làm điều đó. Tại sao? Lý do là vì Common Lisp cố gắng tiết kiệm với việc sử dụng ký tự trong ngôn ngữ và để lại các ký tự như [
, ]
, {
và }
cho người dùng cho tiện ích mở rộng cú pháp của riêng mình. Thường thì người dùng Lisp phát triển các ngôn ngữ nhúng và để làm cho dễ dàng hơn một chút, tiêu chuẩn Common Lisp cố gắng giữ mức sử dụng ký tự ở mức tối thiểu và cũng cung cấp cơ chế của các ký tự macro và ký tự macro.
Để giảm mức sử dụng ký tự, một ký tự công văn #
được sử dụng và ký tự tiếp theo sẽ xác định những gì có thể được biểu thị. #b
cho số nhị phân. #x
cho số thập lục phân. #c
cho số phức. #(
cho vectơ. #'
cho tên hàm. Cộng thêm nhiều nữa.
Vì Lisp thường là ngôn ngữ lập trình có thể lập trình, cú pháp cấp ký tự này có thể được người dùng thay đổi. Xem hàm SET-DISPATCH-MACRO-CHARACTER.
bạn đã cung cấp một bài viết tuyệt vời! Tôi tìm thấy nó chỉ khi tôi cần nó! – TheGeeko61