Tôi đã thiết kế một ngôn ngữ trong đó số học con trỏ là công cụ chính của lập trình.
Dưới đây là một số ví dụ.
(print 0 to 8)
=9[>1=9-*-1.>-1-1]
(print 1 to 10 with spaces in between, character literal extension used)
=1[.>1=10-*-1[>1=' '!>-2+1;-2];1]='\n'!
(compute the factorial of 10)
=10>1=*-1-1[>-1**1>1-1]>-1.
(print "hi")
=104!=105!
(print "hi" with extension for arrays)
={104,105,0}[!>1]
(print "Hello, world!" with extension for C-style string literals)
="Hello, world!"[!>1]
Đặc tả ngôn ngữ
Định nghĩa ngôn ngữ rất đơn giản. Bạn sẽ hiểu rất dễ dàng nếu bạn có kinh nghiệm với C, nhưng tôi sẽ không cho là như vậy.
Mọi chương trình trong PulumLang đều có con trỏ , nói ngắn gọn là P
. Bạn có thể nghĩ nó như một biến toàn cục duy nhất ẩn mà bạn có thể kiểm soát bằng cách sử dụng các lệnh . P
ban đầu chỉ vào đầu của mảng . Mỗi phần tử trong mảng có loại int
là số nguyên có chữ ký 32 bit.
Dành cho lập trình viên C
int32_t *P = malloc(1000);
Trong PulumLang, có các lệnh và đối số . Một đối số là một int
phải đi sau một lệnh. Tất cả các lệnh được thực hiện từ trái sang phải trừ khi có quy định khác. Sau đây là danh sách các lệnh. A
là viết tắt của lập luận. Một lệnh không A
có nghĩa là nó không có đối số. Một lệnh với A
phải có một đối số. Bên trong dấu ngoặc đơn là biểu thức C tương đương.
=A
: gán A tại P (*P = A
)+A
: thêm A tại P (*P += A
)-A
: trừ A tại P (*P -= A
)*A
: nhân với A tại P (*P *= A
)/A
: chia cho A tại P (*P /= A
)>A
: di chuyểnP
bởiA
(P += A
).
: in số nguyên tại P (printf("%d", *P)
)!
: in số nguyên tại P dưới dạng ASCII (printf("%c", (char)*P)
)[
: nếu giá trị tại P bằng 0, hãy chuyển đến lệnh sau]
(while (*P) {
)]
: đi đến trước[
đó là cặp phù hợp (}
);A
: nếuA
là tích cực, đi đến lệnh sauA
lần thứ]
tiếp theo; nếuA
là tiêu cực, đi đếnA
thứ[
đến trước; nếu A bằng 0, không làm gì cả.
Một số nguyên là một đối số.
Hai sau đây là các đối số đặc biệt có một đối số.
-A
: được đánh giá là một đối số có cùng giá trị tuyệt đối nhưA
và dấu ngược lại củaA
; trừ đơn phương*A
: di chuyểnP
theoA
, đánh giá giá trị tạiP
, di chuyểnP
theo-A
(P[A]
)
Tất cả các nhận xét trong PulumLang nằm giữa dấu ngoặc đơn (comment)
.
Chương trình ví dụ
Chương trình này tính từ 1 đến 10 là một ví dụ tốt để hoàn thành sự hiểu biết của bạn.
(print 1 to 10 with spaces in between)
=1[.>1=10-*-1[>1=32!>-2+1;-2];1]=10!
Hãy cẩn thận khi bạn giải thích -*-1
. -
là lệnh và *-1
là đối số. Một số nguyên có nghĩa là kết thúc một cặp đối số lệnh.
Nó có thể được dịch sang C với sự tương ứng 1-1
int main(void) {
int32_t *P = malloc(1000);
*P = 1; // =1
l:
while (*P) { // [
printf("%d", *P); // .
P += 1; // > 1
*P = 10; // =10
*P -= P[-1]; // -*-1
while (*P) { // [
P += 1; // >1
*P = 32; // =32
printf("%c", (char)*P); // !
P += -2; // >-2
*P += 1; // +1
goto l; // ;-2
} // ]
break; // ;1
} // ]
*P = 10; // =10
printf("%c", (char)*P); // !
return 0;
}
Phần mở rộng có thể được áp dụng cho ngôn ngữ này, chẳng hạn như ký tự, mảng, chuỗi ký tự, v.v., nhưng bạn không phải thực hiện chúng, vì đơn giản.
Các thách thức
Bạn phải triển khai các tính năng cốt lõi được nêu chi tiết trong phần Đặc tả ngôn ngữ và các GHI CHÚ bên dưới. Hãy thử với ngôn ngữ lập trình yêu thích của bạn, viết chương trình ngắn nhất có thể.
CHÚ THÍCH 1: Kích thước của mảng không xác định. Nhưng nó phải đủ lớn để giải quyết hầu hết các vấn đề.
CHÚ THÍCH 2: Tràn số nguyên không xác định.
CHÚ THÍCH 3: Thông số kỹ thuật chỉ xác định kết quả hoặc hiệu ứng của các cấu trúc ngôn ngữ nhất định. Ví dụ: bạn không phải thực hiện chính xác các bước trong định nghĩa của đối số *
.
CHÚ THÍCH 4: Bất kỳ ký tự nào không phải là lệnh, đối số hoặc nhận xét Khoảng trắng đều bị bỏ qua. =104!=105!
cũng giống như = 1 0 4! = 1 05 !
ví dụ.
CHÚ THÍCH 5: Nhận xét không được lồng nhau. ((comment))
là một lỗi cú pháp.
CHÚ THÍCH 6: Tôi đã thực hiện một thay đổi đột phá để sửa một lỗ hổng trong ngôn ngữ của mình. Các ~
lệnh bây giờ không sử dụng và ;
luôn có một đối số.
CHÚ THÍCH 7: Mỗi số nguyên là số thập phân.
=9[>1=9-*-1.>-1-1]
in 0 đến 9? Sau khi nó gợi ý 8 vì P [0] = 1 thì nó trừ 1 ngay trước khi kết thúc vòng lặp làm cho P [0] = 0 và sau đó khi nó bắt đầu lại vòng lặp, nó sẽ thoát vì P [0] = 0 vì vậy ví dụ chỉ nên in 0 đến 8. Hay tôi thực sự bối rối?