Một thư viện C++ mới có tên là Shorty vừa xuất hiện, hứa hẹn đơn giản hóa biểu thức lambda với cú pháp ngắn gọn hơn. Thư viện này đã làm dấy lên nhiều cuộc thảo luận trong cộng đồng lập trình viên, với các phản ứng từ hào hứng đến kinh hoàng khi một số người cho rằng nó thêm một lớp phức tạp vào một ngôn ngữ vốn đã phức tạp.
Shorty nhằm cung cấp một giải pháp thay thế ngắn gọn hơn cho cú pháp lambda tiêu chuẩn của C++, sử dụng tiền tố dấu đô la như $lhs
, $rhs
, và $it
để truy cập các đối số hàm. Cách tiếp cận này cho phép các lập trình viên viết mã dễ đọc hơn cho các thao tác phổ biến như sắp xếp, lọc và biến đổi.
Tranh cãi về dấu đô la
Một trong những khía cạnh được thảo luận nhiều nhất của Shorty là việc sử dụng dấu đô la ($
) trong các định danh, mà nhiều người bình luận chỉ ra rằng không phải là tiêu chuẩn trong C++. Mặc dù dấu đô la đã được chấp nhận như một phần mở rộng bởi nhiều trình biên dịch từ những ngày đầu của C, nhưng nó không phải là một phần của tiêu chuẩn ngôn ngữ chính thức.
Đó là một phần mở rộng phổ biến nhưng không phải là tiêu chuẩn. Cả C23 và C++23 chỉ cho phép các định danh bắt đầu bằng ký tự Unicode XID_START, loại trừ $.
Các nhà phát triển thư viện rõ ràng đã nhận thức được giới hạn này, vì dự án của họ bao gồm các tùy chọn trình biên dịch để ngăn chặn cảnh báo về việc sử dụng không tiêu chuẩn này. Một số người bình luận đã truy nguyên phần mở rộng này trở lại các hệ thống VMS, gợi ý rằng đó có thể là lý do tại sao GCC ban đầu bao gồm hỗ trợ dấu đô la.
Mẫu biểu thức và tiền nhiệm
Nhiều lập trình viên trong các bình luận nhận ra rằng Shorty không giới thiệu một khái niệm hoàn toàn mới, mà đúng hơn là xây dựng dựa trên các kỹ thuật đã được thiết lập trong C++. Thư viện sử dụng mẫu biểu thức, một kỹ thuật lập trình meta đã được sử dụng trong nhiều thư viện C++ trong nhiều năm.
Nhiều người bình luận đã so sánh Shorty với các thư viện trước đó có mục tiêu tương tự, đặc biệt là Boost.Lambda, Boost Lambda2, Boost HOF, và Boost Hana. Tuy nhiên, có sự công nhận rằng Shorty dường như hoàn thiện hơn về tính năng so với một số tiền nhiệm này, cung cấp phạm vi khả năng rộng hơn cho việc truy cập đối số, gọi hàm và biến đổi.
Các tính năng chính của Shorty
- Truy cập đối số:
$0
-$9
,$lhs
,$rhs
,$it
,$a
-$f
,$x
,$y
,$z
- Truy vấn đối số:
$argc
,$args
- Bắt giá trị:
$(v)
,$ref(v)
,$value(v)
,$val(v)
,$copy(v)
,$fixed
,$const
- Gọi hàm:
$<callable>(args...)
,$call(args...)
- Ép kiểu:
$<T>(expr)
,$cast(expr)
- Tạo tuple:
($a, $b, $c)
,($0, $1)
- Phép toán gán:
$a += 2
, v.v.
Các thư viện tương tự
- Boost.Lambda (lỗi thời)
- Boost Lambda2
- Boost HOF
- Boost Hana
Phản ứng trái chiều
Phản ứng của cộng đồng đối với Shorty cho thấy quan điểm chia rẽ về lập trình meta và các phần mở rộng ngôn ngữ C++. Một số lập trình viên bày tỏ sự phấn khích về tiềm năng của thư viện, với một người bình luận thừa nhận rằng ban đầu họ không thích cú pháp nhưng dần dần chấp nhận nó. Những người khác đề xuất họ có thể thay thế dấu đô la bằng dấu gạch dưới trước khi sử dụng, tương tự như cách tiếp cận của Boost::Lambda2.
Ở phía đối lập, một số lập trình viên mô tả thư viện là đáng sợ hoặc bị nguyền rủa, bày tỏ lo ngại rằng nó thêm một lớp phức tạp nữa vào C++. Một người bình luận đặc biệt đề cập đến khả năng tạo ra thêm nhiều thông báo lỗi khó hiểu hơn—một điểm đau nổi tiếng trong phát triển C++ từng truyền cảm hứng cho một cuộc thi mà bài dự thi chiến thắng đã tạo ra thông báo lỗi lớn hơn 5,9 tỷ lần so với mã nguồn.
Mặc dù có những chỉ trích này, một số người bình luận kỹ thuật nhận thấy việc triển khai đáng ngạc nhiên là dễ đọc và có cấu trúc tốt so với các thư viện lập trình meta template khác, cho thấy rằng bản thân khái niệm này có thể có giá trị ngay cả khi lựa chọn cú pháp vẫn còn gây tranh cãi.
Khi C++ tiếp tục phát triển với các tiêu chuẩn mới hơn như C++23, các thư viện như Shorty thể hiện sự căng thẳng liên tục giữa tính thuần khiết của ngôn ngữ và tính biểu đạt thực tế đã đặc trưng cho sự phát triển của C++ trong nhiều thập kỷ. Liệu Shorty sẽ được áp dụng rộng rãi hay chỉ là một thí nghiệm thú vị vẫn còn phải xem, nhưng nó chắc chắn đã làm dấy lên cuộc thảo luận sâu sắc về hướng phát triển tương lai của cú pháp C++.
Tham khảo: terser (shorter) lambda == SHORTY