Nhiều năm trước, tôi đã học Applesoft Basic. Các chuỗi luôn luôn có hậu tố $
và các mảng có hậu tố %
. Đó chỉ là cách ngôn ngữ làm việc. Bạn nhìn vào một cái gì đó, bạn biết nó là gì. Tôi chưa bao giờ đi sâu vào phiên dịch để hiểu tại sao đây là trường hợp hoặc các quyết định thiết kế khiến nó trở nên như vậy.
Sigil trong php xuất phát từ ảnh hưởng perl của nó (bị ảnh hưởng bởi awk
và sh
). Sigil trong perl là khá nhiều hơn một chút $
vì nó có thể xác định nhiều loại khác nhau:
$
vô hướng
@
danh sách
%
băm
&
cơ sở mã hóa
*
lỗi chính tả
Sigil xác định phần nào của cấu trúc bảng biểu tượng mà bạn đang xem. Đằng sau hậu trường, mục nhập bảng biểu tượng cho foo (được truy cập thông qua *foo
- typeglob) có mọi thứ có thể là một foo. Có $foo
, @foo
, %foo
, các định dạng foo
, &foo
, foo filehandle, vv ...
Điều này cũng cho phép tạo một bí danh của biến này sang biến khác:
#!/usr/bin/perl
$foo = "foo";
@qux = (1,2);
*bar = \$foo;
*bar = \@qux;
print "$bar @bar\n";
Bản in này foo 1 2
- trong perl, đây là những gì các sigils thực sự dành cho, không phải là bạn nên làm điều này mà là có những điều đằng sau hậu trường mà họ làm.
Các sigils không có quá nhiều khả năng đọc, nhưng để người ta có thể có $foo
và @foo
không có sự va chạm trong không gian tên (so sánh các ngôn ngữ khác mà người ta không thể có cả hai int foo; int[] foo;
)
Sigils cho khả năng đọc là thứ được học như một phần của bất kỳ ngôn ngữ nào - đọc cú pháp. Theo giả thuyết, bạn có thể thực thi chính loại (như ký hiệu của Lynn) là một phần của mã định danh.
Một cái gì đó trong lex dọc theo dòng:
typeChar [is]
capLetter [A-Z]
letter [a-z]
digit [0-9]
%%
{typeChar}{capLetter}(letter}|{digit})* { prientif("iddentifier");}
%%
Và sau đó bạn có thể có mã như
iFoo = 42;
sFoo = "a string";
iBar = iFoo * 2;
Tôi không nói rằng đây là một ý tưởng tốt, nhưng thay vào đó, một người quen với ngôn ngữ sẽ có thể đọc được điều này một cách tự nhiên và nghĩ rằng nó giúp tăng khả năng đọc trong khi một người không quen với ngôn ngữ này có thể nghĩ rằng nó chỉ thêm vào một loạt các tiếng ồn cho ngôn ngữ.
Tuy nhiên, sau khi làm việc với một ngôn ngữ được định nghĩa theo cách này, tôi có thể đọc nó mà không gặp rắc rối.
Một số người thích chúng, một số người thì không. Có những cuộc chiến thần thánh lớn trên các diễn đàn khác nhau tranh luận về điều này và nó thực sự làm rõ số lượng bạn đã sử dụng chúng.
Người ta có thể thiết kế một ngôn ngữ mới cho những người không lập trình sử dụng sigils và bất kỳ ai chưa từng lập trình trước đó sẽ không bao giờ phàn nàn một chút về họ. Mặt khác, bạn không thể có chúng như một phần của ngôn ngữ và sau đó các lập trình viên ruby hoặc perl phàn nàn rằng họ đang bỏ lỡ một số thông tin chính.
Nó thực sự không quan trọng. Điều quan trọng là làm thế nào sigils sẽ phù hợp với ngôn ngữ nếu bạn sử dụng chúng hay không. Bạn có muốn làm "123 $foo 456"
hoặc phải làm "123 " + foo + " 456"
? Đây là nơi quyết định nên được đưa ra.