Một phiên bản cải tiến của GolfScript [đã đóng]


12

Tôi đang lên kế hoạch viết một GolfScript cải tiến cho các chương trình thậm chí ngắn hơn có thể làm được nhiều việc hơn. Đây không phải là một thách thức; đó là một yêu cầu phản hồi và lời khuyên về những gì tôi nên làm. (xem thẻ)

Tôi không chắc đây có phải là Community Wiki không. Nếu bạn nghĩ vậy, chỉ cần gắn cờ cho người điều hành để chuyển đổi nó :)

Ngôn ngữ này sẽ rất giống với GolfScript. Nó vẫn được viết bằng Ruby. Tuy nhiên, nó có một vài điểm khác biệt:

  • Sử dụng `như một dấu phân cách chuỗi, bởi vì đó là một ký tự không phổ biến, do đó sẽ ít thoát hơn. (Một nhân vật khác có thể thay thế chức năng của nó, như #(nhiều hơn về sau)). \`để thoát khỏi một backtick, \\để thoát một dấu gạch chéo ngược và không có chuỗi thoát nào khác. Nếu bạn cần một dòng mới, chỉ cần dán một dòng mới theo nghĩa đen thực sự trong chuỗi.
  • Sử dụng Ruby Rationalcho điểm nổi chính xác tùy ý, một trong những sai sót lớn của GolfScript.
  • Khả năng chuyển đổi các loại sang các loại khác. Ví dụ: bạn có thể chuyển đổi một khối thành một chuỗi.
  • Biểu thức chính quy. Có lẽ được tạo ra với "...". Các nhà khai thác sẽ được quá tải cho họ là tốt. Ví dụ , "\W"~{`Invalid: non-word character`}{`OK`}if. Sẽ tự động thực thi khi được đẩy từ một biến, như các khối.
  • Đối tượng tệp và ngày, để làm nhiều thứ không thể có trong GolfScript. Chúng sẽ không có nghĩa đen, nhưng sẽ có các chức năng để khởi tạo chúng, chẳng hạn như `file.txt`fl(tên của chức năng tạo tệp có thể thay đổi).
  • Có thể băm, nhưng tôi không chắc về điều đó. Tôi có nên
  • Chức năng trợ giúp để làm nhiều hơn. Ví dụ, `http://example.com`netđể truy cập mạng (một lần nữa, netnhà điều hành có thể được đổi tên). rbđể thực thi một chuỗi dưới dạng mã Ruby. Sẽ có nhiều hơn nữa trong số này; đề nghị chào mừng.
  • Không có ý kiến, vì vậy mà #có thể được sử dụng cho một cái gì đó khác. Nếu bạn muốn một bình luận, `comment here`;sẽ làm việc tốt. (Có lẽ #có thể thay thế `chức năng của)
  • Nó sẽ được viết lại hoàn toàn theo cách mà việc thêm chức năng sẽ dễ dàng hơn nhiều. Về cơ bản, mã sẽ dễ đọc hơn. (Bạn đã thấy nguồn GolfScript chưa? :/)
  • Nó sẽ có trên Github để có thể hợp tác làm việc. Tôi sẽ cấp phép cho nó theo MIT hoặc một cái gì đó.
  • Không có dòng mới cuối cùng, vì vậy các mánh khóe gian lận hoạt động: P

Và tôi đang tách biệt chúng vì tôi nghĩ chúng là những thay đổi mạnh mẽ và hữu ích nhất (ngoại trừ có thể thêm điểm nổi):

  • Nó sẽ có nhiều chức năng Ruby tích hợp. Ví dụ: shuffle(có thể viết tắt là sf) (trước đây đã lấy 9 ký tự ), tr(trước đó là 14 ký tự ), sample( sm, trước đó .,rand=), flatten(fl , trước đó ???), v.v.
  • Nó sẽ được kết hợp, giống như Rebmu. Ví dụ, bây giờ bạn có thể làm ~:a0<{0a-}aIF(sử dụng tên biến chữ) thay vì ~:$0<{0$-}$if(ghi đè hàm sắp xếp). (ví dụ từ đây ). Lưu ý rằng theo cách này, nó không phân biệt chữ hoa chữ thường và các số không được phép trong các tên biến. Theo ý kiến ​​của tôi thì không sao vì đây là ngôn ngữ chơi gôn: P
  • Nó sẽ có gỡ lỗi. Tôi sẽ thêm khả năng cung cấp một cờ chỉ định các dấu phân cách mảng, dấu phân cách phần tử, v.v., đầu ra số (hợp lý, float hoặc int?), Từng bước một hướng dẫn, mã hóa và xuất ra từng mã thông báo thay vì chạy chương trình, Vân vân.

Vì vậy, câu hỏi của tôi là: có gì để cải thiện? Bạn nghĩ tôi nên thêm gì?

Bất kỳ ý tưởng khác cho điều này, trước khi tôi bắt đầu mã hóa nó?


Hãy nhận ra rằng nếu bạn thêm bột nhão bạn sẽ mất độ nhạy trường hợp.
bến 31/12/13

@marinus Tôi nhận ra điều đó. Tôi nên đã làm rõ điều đó; chỉnh sửa ...
Doorknob

Ngoài ra, những gì nó thực sự cần là một cách để thực hiện I / O rõ ràng (đối với các chương trình tương tác). Trình thông dịch có thể kiểm tra trước nếu chương trình sử dụng I / O rõ ràng và chỉ thực hiện I / O ẩn nếu không có.
bến 31/12/13

@marinus Tuyệt vời, bạn nên thêm câu đó làm câu trả lời sau đó :)
Doorknob

1
@Claudiu Sự phát triển của tôi về ngôn ngữ mới của tôi khá sống động, mặc dù gần đây tôi khá bận rộn nên tôi đã không làm được gì nhiều với nó trong một thời gian ngắn. Một số trong những ý tưởng này chỉ là những ý tưởng không hay, mà tôi không sử dụng: P
Doorknob

Câu trả lời:


17

I / O linh hoạt

Golfscript hiện tại không thể được sử dụng cho các chương trình tương tác. Tôi đề nghị một số chức năng cho đầu vào rõ ràng được thêm vào (ví dụ readline, getcharvà bạn bè). Trình thông dịch sẽ xem chương trình có sử dụng chúng không trước khi chạy nó.

Nếu chương trình không gọi bất kỳ chức năng đầu vào nào, trình thông dịch sẽ hoạt động như Golfscript thông thường.

Tôi sẽ không mong đợi trình thông dịch phát hiện các hàm đầu vào trong mã được tạo ra trong thời gian chạy, nhưng nếu nó bằng cách nào đó có thể làm điều đó, kudos.


Đây là một ý tưởng hay; io giới hạn là một trong những hạn chế lớn của golfscript. +1
Doorknob

11

Nội dung ngắn hơn

Bí danh một ký tự cho tất cả các lệnh dựng sẵn không có chúng. Tôi sẽ sử dụng basenhiều hơn nếu nó chỉ B.


Nhưng nếu bạn sử dụng bnhư một tên biến thì sao? Vẫn; ý tưởng tốt; bạn chỉ cần nhớ không sử dụng tên đó nếu bạn sẽ sử dụng chức năng đó và nếu bạn không sử dụng chức năng đó, thì nó hoàn toàn không ảnh hưởng đến bạn.
Doorknob

@DoorknobofSnow, bạn đã có thể sử dụng các hàm dựng sẵn (và thậm chí các mã thông báo như ^hoặc $) làm tên biến. Nó không làm cho vấn đề đó tồi tệ hơn. Ngoài ra, tôi đã đề xuất các bí danh để cho phép khả năng tương thích ngược, vì vậy bạn sẽ chỉ phải sử dụng tên dài hơn nếu bạn đã gán một cái gì đó khác cho bí danh ngắn hơn.
Peter Taylor

4
Zcho zipcũng sẽ rất hữu ích.
Howard

Có lẽ chúng tôi có thể phát hành một thư viện tiêu chuẩn chính thức cho GolfScript. Nhưng tôi không rõ về cách nó có thể được bao gồm trong các giải pháp (thiếu #include"#{IO.read'lib'}"~quá dài).
Howard

@Howard Bây giờ đó là một ý tưởng ... Tôi có thể thêm thư viện vào ngôn ngữ của mình, có thể là như thế mylang -Llibname somefile.ext.
Doorknob

9

Kết hợp div-mod

Đây là một chút thích hợp hơn so với một số gợi ý, nhưng khi làm việc trên các chương trình lý thuyết số, tôi thường thấy mình muốn một hoạt động xuất hiện hai số nguyên abtừ ngăn xếp và đẩy a/ba%b. (Hiện tại đây là 1$1$/@@%).


Vì nó rất thích hợp, có lẽ giống như dvmDiV-Mod. Cảm ơn tất cả những ý tưởng :-) 1
tay nắm cửa

8

Số

Thay đổi từ vựng sao cho số 0 đứng đầu không phải là một phần của số:

# current behaviour
01     # -> 1

# new
01     # -> 0 1

_Thay vào đó, các số âm nên được viết bằng :

# current behaviour
1 2-3   # -> -1 3

# new
1 2_3     # -> 1 2 -3

Wow, thật thú vị. Thông thường bạn thường không đẩy hai số liên tiếp, nhưng điều này sẽ giúp rất nhiều. Điều tiêu cực cũng rất tuyệt, thay vì 0 100-âm 100. +1
Doorknob

1
Tôi đã nghĩ về điều này trước đây. Không nên có bất kỳ sự hỗ trợ nào cho các số nguyên âm. Nó đã được xử lý bởi ~. Ví dụ -1 là 0~. Điều này làm cho một số lượng nhỏ các số dài hơn bởi một char, nhưng loại bỏ nhu cầu thường xuyên vừa phải cho khoảng trắng sau -.
Peter Taylor

Đợi một chút, làm thế nào bạn sẽ đẩy, ví dụ, 1001? Tôi nghĩ rằng bạn có nghĩa là dẫn đầu không, không theo dõi.
Doorknob

@DoorknobofSnow Phải.
Howard

Bạn sẽ nghĩ gì về việc làm {0\-}:~;( ~phủ định một số) và sử dụng notcho bitwise (giống như and or xor)?
Doorknob

8

Truy cập vào toàn bộ ngăn xếp

GolfScript là ngôn ngữ dựa trên ngăn xếp, nhưng quyền truy cập vào tất cả trừ ba mục hàng đầu trên ngăn xếp bị giới hạn <integer>$để sao chép mục thứ n. Sẽ rất hữu ích khi có một cái gì đó giống như rolllệnh của PostScript để dễ dàng làm việc hơn ba biến "sống".

Lý tưởng nhất là sẽ có các phiên bản một-arg và hai-arg, nhưng nếu không có đủ tên xung quanh thì one-arg sẽ được ưu tiên cho một ký tự một ký tự.

Người ta chỉ cần lấy số lượng vật phẩm để lăn. Vd 1 rollkhông làm gì cả; 2 rolltương đương với \; 3 rolltương đương với @; 4 rollvà đối với số cao hơn không có tương đương hiện có; gần nhất có thể là một cái gì đó như

]-4/()\+\+[]*-1%~

(và điều đó thậm chí không xử lý các số nguyên không ở các vị trí nhất định trên ngăn xếp hoặc hoạt động [và gần như chắc chắn cũng phá vỡ các vòng lặp).

Một hai arg cũng mất một số tiền để cuộn; a b roll2tương đương với {a roll}b*.


Vì vậy, giống như của Ruby rotate. Bạn nên chỉnh sửa câu này thành câu trả lời CW.
Doorknob

@Doorknob, không. Tôi đang nói về hoạt động trên một lát của ngăn xếp, không phải trên một mảng.
Peter Taylor

Umm ... Tôi không chắc ý của bạn là gì. Tôi không quen thuộc với postcript, nhưng rollchỉ xoay mảng, phải không?
Doorknob

@DoorknobofSnow, chồng . Một mảng là một mục đi trên ngăn xếp.
Peter Taylor

Oh, vì vậy nó xoay toàn bộ ngăn xếp . Ah, nó có thể hữu ích! +1
Doorknob

8

Camam

Tôi đã triển khai "một GolfScript cải tiến" và nó được gọi là CJam - http://sf.net/p/cjam
Bây giờ ở phiên bản thứ hai (phiên bản 0.6), nó đã có nhiều tính năng nếu không phải là hầu hết các tính năng được thảo luận ở đây. Tôi sẽ cố gắng liệt kê chúng:

  • vẫn được viết bằng Ruby - không, java
  • sử dụng `như một dấu phân cách chuỗi - không, nhưng nó sử dụng các chuỗi được trích dẫn kép với mức thoát tối thiểu ( \chỉ thoát \")
  • dấu phẩy động - được hỗ trợ, nhưng chỉ "đôi" tiêu chuẩn, không chính xác tùy ý
  • chuyển đổi loại sang loại khác - có
  • biểu thức chính quy - chưa, nhưng có kế hoạch; sẽ sử dụng các chuỗi thông thường với các toán tử đặc biệt
  • Đối tượng tệp và ngày - không, nhưng có thể lấy ngày / giờ hiện tại
  • băm - giả sử những thứ đó giống như các bản sao trăn hoặc bản đồ java, thì chúng không được hỗ trợ (có thể xem xét trong tương lai)
  • chức năng trợ giúp để làm nhiều hơn - có, rất nhiều
  • `http://example.com`net - "example.com"g
  • thực thi một chuỗi dưới dạng mã Ruby - không
  • không có ý kiến ​​- chính xác, #được sử dụng cho một cái gì đó khác,"comments like this";
  • dễ dàng hơn để thêm chức năng - Tôi nghĩ vậy, nhưng tôi cũng thiên vị :)
  • trên Github - thậm chí tốt hơn (theo ý kiến ​​của tôi, vui lòng không bắn) - trên SourceForge, sử dụng hg
  • được cấp phép theo MIT - có
  • không có dòng mới cuối cùng - đúng
  • xáo trộn - mr
  • tr - er
  • mẫu - không được thực hiện, _,mr=
  • làm phẳng - không được thực hiện, nhưng có lẽ dễ dàng hơn để đạt được
  • được nhúng - không, nhưng định danh không cần phải tách rời
  • gỡ lỗi - chỉ dấu vết ngăn xếp và edtoán tử để hiển thị ngăn xếp

  • I / O linh hoạt - có, nhưng chỉ nhập liệu rõ ràng

  • nội dung ngắn hơn - có, b= cơ sở, z= zip
  • riêng biệt dẫn 0 - không, nhưng có thể sử dụng các biến được xác định trước
  • định hướng -- có, nhưng không với _; 1 2-3-> 1 2 -3; 1 2m3->-1 3
  • cuộn / xoay ngăn xếp - không
  • tập hợp mảng - t
  • thần thánh - md
  • thay đổi từ vựng (đối với định danh) - có, nhiều hơn bên dưới
  • sản phẩm cartesian - không hoàn toàn giống nhau, nhưng có, m*
  • toán tử unicode - không
  • định danh ký tự đơn - toán tử được xác định trước có 1 hoặc 2 ký tự và các biến là các chữ cái viết hoa đơn ký tự; tất cả chúng có thể được nối mà không gây nhầm lẫn cho lexer / trình phân tích cú pháp
  • toán tử trên các khối - không
  • sắp xếp ổn định - có
  • biến các biểu tượng trở lại thành các khối mã - không, nhưng có thể thêm vào sau
  • ngày / giờ hiện tại - et
  • dòng lệnh args - ea
  • phân tách rõ ràng các phần dựng sẵn - có, nhưng chữ hoa là các biến; dựng sẵn là hoặc bắt đầu bằng chữ thường và ký tự đặc biệt
  • tối thiểu và tối đa - có, hiện chỉ dành cho 2 giá trị : e<,e>
  • giá trị tuyệt đối - z(GolfScript cóabs , không thiếu)
  • tổng và sản phẩm của một mảng - :+,:*
  • Khoảng cách Manhattan - không
  • chr - c(chuyển đổi thành ký tự, không phải chuỗi)
  • đổ một chuỗi lên ngăn xếp - chuỗi CJam được tạo thành từ các ký tự, không phải số; để làm đổ các nhân vật{}/
  • một phiên bản :tiêu thụ những gì được lưu trữ - không
  • toán tử cho >=, <=- không, sử dụng <!,>!
  • cơ sở64 và zlib - không
  • các phím tắt cho 1 $, 2 $, 3 $, 4 $, 5 $ - không
  • sao chép hai mục trên cùng - theo kế hoạch; bây giờ sử dụng1$1$
  • biến cục bộ - không
  • Các tính năng của HQ9 + - không, cảm ơn bạn

CJam có nhiều tính năng hơn, hãy xem https://sourceforge.net/p/cjam/wiki/Operators/


7
Tôi không đồng ý với SourceForge và Mercurial tốt hơn GitHub.
nyuszika7h

1
@ nyuszika7h không sao, tất cả chúng ta đều có sở thích của mình
aditsu bỏ việc vì SE là EVIL

Tôi vừa đăng câu trả lời CJam đầu tiên của mình , vì câu trả lời GolfScript của tôi đang rất cần một chức năng sqrt thích hợp. CJam nhanh hơn GolfScript rất nhiều!
Dennis


@aditsu Bạn có thể coi CJam là một phương ngữ của GolfScript hoặc một ngôn ngữ mới lấy cảm hứng từ GolfScript? (Đây là lý do tôi hỏi: codegolf.stackexchange.com/questions/37464/ Khăn )
Martin Ender

6

Thay đổi từ vựng

Công cụ lexer của GolfScript coi một mã định danh Ruby (bất kỳ thứ gì khớp với biểu thức chính quy [_a-zA-Z][_a-zA-Z0-9]*) như một mã thông báo duy nhất. Thay vào đó, nếu nó được coi [a-zA-Z]+là một mã thông báo sẽ giải phóng thành _một phần tử tích hợp và sẽ cho phép một biến alpha được theo sau bởi một số nguyên bằng chữ mà không tách biệt khoảng trắng.


Chà, hiện tại tôi đang sử dụng một cách đơn giản [a-z]+|[A-Z]+, cho việc kết hợp, vì vậy gạch dưới là miễn phí. Đây là một ý tưởng thú vị và rất độc đáo mặc dù! +1
Doorknob

5

Bí danh Unicode

Các lệnh nhiều ký tự có thể có các bí danh unicode. Điều này sẽ tiết kiệm điểm khi điểm được tính bằng ký tự và không tính bằng byte.


7
uh ... chúng tôi không muốn một APL khác ...
John Dvorak

1
Golfscript không phải là bất cứ thứ gì như APL, Unicode hoặc không. Chúng tôi đã có một số APL khác, như J và K. (hoặc thậm chí R trông khá lấy cảm hứng từ APL, đến mức bạn có thể thực hiện các bản dịch theo nghĩa đen khá thường xuyên)
marinus 31/12/13

Điểm khác biệt về APL là nó sử dụng bộ ký tự rất khác so với bất kỳ thứ gì khác, không phải là nó sử dụng vector số học nguyên bản. Tôi thích J, tôi sử dụng nó và tôi thường nâng cao câu trả lời của J. Tôi vẫn chưa đưa ra một câu trả lời APL. Nếu tôi muốn vẽ các chương trình của mình thay vì viết chúng, tôi sẽ sử dụng Piet.
John Dvorak

Tôi nghĩ APL dễ đọc hơn J, chắc chắn dễ đọc hơn Golfscript.
bến tàu

5

Sắp xếp ổn định

Việc $dựng sẵn trên các khối nên thực hiện một loại ổn định.


5

Toán tử tập hợp mảng

["A" "B" "C" "D" "E" "F"] -1 4 S    # -> ["A" "B" "C" "D" -1 "F"]

Bất kỳ tích hợp nào chúng ta có thể làm cho điều đó?


+1 Tôi bắt đầu viết một bài đăng trên blog về việc triển khai tập hợp mảng, nhưng không bao giờ hoàn thành nó. Hiện tại nó cực kỳ khó khăn trong tính tổng quát. Điều này sẽ tạo ra một sự khác biệt lớn cho một số thách thức.
Peter Taylor

Tôi không thể tin rằng điều này chưa được xây dựng trong golfscript. +1
Doorknob

5

Mã định danh một ký tự

Nó không giống như một giải pháp golf mã sẽ có quá nhiều biến. Và nó sẽ tiết kiệm không gian.


Hmm .. Điều này cũng có thể được thực hiện bằng cách thay đổi trình phân tích cú pháp. Có lẽ một lá cờ để xác định hành vi này? Ý tưởng tuyệt vời! +1
Doorknob

4

% dưới dạng dựng sẵn cho sản phẩm

[1 2][1 2 3]%  # -> [[[1 1][1 2][1 3]][[2 1][2 2][2 3]]]

+1; bạn có thể chỉnh sửa câu trả lời CW của tôi và thêm câu trả lời này
Doorknob

Thế còn modulo?
MilkyWay90

3

Hỗ trợ Regex

Việc thiếu hỗ trợ regex luôn khiến tôi trở nên kỳ quặc trong một ngôn ngữ được thiết kế để chơi gôn. Nó sẽ là tuyệt vời để có

  • <string> <string> <string> y(còn gọi là trsử dụng bí danh one-char của Perl cho nó)
  • <string> <string> <string> s (thay thế)
  • <string> <string> <block> s (thay thế bằng gọi lại)
  • <string> <string> m (trận đấu)

Tôi đã đề cập regex trong câu hỏi của tôi.
Doorknob

3

Nội dung cho ngày / giờ hiện tại

Hiện tại rất kỳ quặc để có được ngày / thời gian sử dụng Ruby evals.

D     # -> [2013 12 31]
T     # -> [23 59 59]

Điều đó có đưa ra ngày / thời gian ở Lima hoặc Zulu không?
Peter Taylor

@PeterTaylor Đừng biết - thời gian đang thay đổi ;-)
Howard


Đã được đề cập là loại Thời gian trong OP.
Doorknob

3

Tạo |, & và ^ dựng sẵn làm một cái gì đó hữu ích trên các khối

Ví dụ <array/string> <block> |có thể được sử dụng như chức năng chỉ mục

[0 -10 -20 30 40 -50 60] {0<} |   # -> [1 2 5]

Bất kỳ ý tưởng cho <array/string> <block> &hay <array/string> <block> ^?


Làm gì array block =bây giờ?
John Dvorak

@JanDvorak So sánh. Hữu ích nếu bạn muốn so sánh một chuỗi với một khối, ví dụ "0<" {0<} =.
Howard

Bao lâu bạn cần điều đó? Tôi thà bỏ cái đó và sử dụng array block =cho "chọn theo vị ngữ"
John Dvorak

@JanDvorak chọn theo vị ngữ đã được triển khai bằng cách sử dụng ,.
Howard

Đưng bận tâm. Tiếp tục :-)
John Dvorak

2

Một cách để biến các biểu tượng trở lại thành các khối mã

Hiện tại, chúng ta có thể liên kết các khối mã với các biểu tượng với : , nhưng không có cách nào để đảo ngược quá trình: thực thi một ký hiệu được liên kết với một khối mã chỉ thực thi khối.

Tôi có thể thấy một vài cách để thực hiện điều này:

  1. thêm cú pháp mới, ví dụ #foođể đẩy giá trị của foongăn xếp, ngay cả khi đó là khối mã hoặc

  2. thêm một toán tử để mở rộng mọi ký hiệu trong một khối mã, do đó (sử dụng _như toán tử mới), vd {2*}:dbl; {dbl dbl}_sẽ tạo ra {2* 2*}.

Tôi có thể thấy lợi thế cho cả hai phương pháp. Cái sau có thể thay thế cho cái trước, với giá của hai ký tự phụ ( {foo}_thay vì #foo), nhưng tôi có thể thấy một số ứng dụng tiềm năng cho cú pháp trước trong đó hai ký tự đó sẽ bị cấm (ví dụ: sử dụng array #func %thay vìarray {func} % ).

Trong khi đó, cú pháp trước có thể được sử dụng để thay thế cú pháp sau nếu có một cách thuận tiện để lặp đi lặp lại các mã thông báo trong một khối mã (dù sao nó cũng có thể hữu ích).


Trong cả hai trường hợp, tôi đề xuất rằng các biểu tượng mở rộng được liên kết với các phần tử dựng sẵn (nghĩa là được triển khai trong mã Ruby) sẽ trả về một số loại sơ khai có thể được gọi để có được chức năng của phần tử tích hợp, trong khi không thể hoặc chỉ không có khả năng bị ghi đè. Ví dụ #$(hoặc {$}_) có thể trả về {builtin_dollar}, ví dụ , nơi builtin_dollarsẽ chứa triển khai thực tế của tích $hợp (và #builtin_dollarhoặc {builtin_dollar}_chỉ nên trả về{builtin_dollar} chính nó).

Điều này sẽ cho phép các phần dựng sẵn được xác định lại mà không mất quyền truy cập vào chức năng của chúng (xem đề xuất trước đó của tôi ), do đó, nếu tôi, nói, vì một số lý do muốn hoán đổi ý nghĩa của $@, tôi chỉ có thể làm #$ #@ :$; :@;(hoặc {$}_ {@}_ :$; :@;).


Một chi tiết tôi không chắc chắn là người _vận hành nên làm gì nếu khối mã chứa các phép gán biến. Điều rõ ràng sẽ là không để bất kỳ :symbolmã thông báo nào bị ảnh hưởng và mở rộng bất cứ thứ gì khác, nhưng điều này sẽ gây ra _bất kỳ mã nào sử dụng các biến cục bộ. Làm cho nó khôngMặc dù vậy, phá vỡ mã như vậy có thể rất phức tạp.
Ilmari Karonen

1
Phiên bản thứ hai của bạn sẽ phù hợp với một toán tử làm phẳng trên mảng : [[1] [2] [3]] _ -> [1 2 3].
Howard

Vậy kết quả của nó là 2:A;{1:A;A}_gì?
Howard

Ngây thơ, {1:A;2}(hoặc, là kỹ thuật, {1:A builtin_semicolon 2}nếu bao gồm tính năng mở rộng tích hợp). Nếu một số loại tính năng "loại trừ biến cục bộ" được bao gồm, nó có thể đánh giá chính đáng {1:A;A}.
Ilmari Karonen

Hoặc để được kỹ thuật hơn nữa {builtin_1 :A builtin_semicolon 2}.
Howard

1

Biến đặt trước với dòng lệnh args

Thật không may, không có bất kỳ char nào không được gán, nhưng có lẽ chúng ta có thể sử dụng Acho điều đó?


_có sẵn Có lẽ vậy? Dù sao, vâng, golfscript cần một cách lấy dòng cmd lập luận +1
Doorknob

0

Các hàm Ruby gốc mà tôi nên thực hiện

Đây là Cộng đồng Wiki; vui lòng chỉnh sửa và thêm các chức năng bạn nghĩ rằng tôi nên thực hiện!

Định dạng: " nativeFunctionName( nameInMyLanguage)"

  • shuffle( sf)
  • tr( tr)
  • sample( sm)

0

Lấy các tính năng từ APL và HQ9 +!

  • Các phím tắt, như trong APL. EDIT: chỉ thấy câu trả lời "unicode aliases". Ý tôi là vậy :)
  • Các phím tắt định hướng golf khác, như trong H9 +, HQ9 +, CHIQRSX9 +

Được rồi, vậy làm thế nào bạn sẽ đề xuất đó? Bất kỳ ý tưởng cụ thể?
Doorknob

ký tự unicode cho phép thực hiện những điều phức tạp chỉ trong một ký tự.
xem

@Doorknob of Snow, tôi đã cập nhật câu trả lời của mình bằng các phím tắt tôi muốn xem: những từ APL và những từ CHIRQSX9 + :)
xem

Hmm, điều hq9 + có vẻ quá gian lận :-P
Doorknob

Đó là định hướng chơi gôn: Theo ý kiến ​​của tôi, ngôn ngữ của bạn cũng nên làm ít nhất :)
xem

0

Phân tách rõ ràng tích hợp

ví dụ: thủ đô: tích hợp; làm cho B khả thi


1
Như đã đề cập ở trên, không cần phải tách. Nếu ai đó thích ghi đè lên nội dung, anh ta có thể làm như vậy. Tôi thậm chí tìm thấy các ứng dụng hữu ích của các nhà khai thác ghi đè như {-}:+.
Howard

Không cần, ngôn ngữ này cũng sẽ không nhạy cảm.
Doorknob

2
Vì mục tiêu là cung cấp ít nét hơn trên mỗi lỗ, nên có độ nhạy trường hợp và tích hợp nhiều hơn dẫn đến tuyên bố sứ mệnh một cách hiệu quả.

0

Biến / đóng cục bộ

Một điều tôi thực sự nhớ trong GolfScript là khả năng thay đổi tạm thời giá trị của một biểu tượng .

Cụ thể, hiện tại không có cách nào để tạm thời ghi đè ý nghĩa của một "nguyên thủy" tích hợp: một khi bạn, nói lại $, xác định lại , bạn sẽ không bao giờ sắp xếp lại bất cứ điều gì trong chương trình đó nữa. (Chà, không phải không viết cách thực hiện sắp xếp của riêng bạn, ít nhất là vậy.) Thật là tốt khi có thể nói, ví dụ, trong khối mã này $ có nghĩa là một cái gì đó khác, nhưng vẫn giữ ý nghĩa bình thường ở nơi khác.

Liên quan đến vấn đề trên, sẽ rất tốt nếu liên kết các biểu tượng trong một khối mã với giá trị hiện tại của chúng . Chắc chắn, tôi có thể viết, nói {$-1%}:rsortvà có thể sử dụng rsortđể sắp xếp và đảo ngược một mảng, nhưng nó chỉ hoạt động miễn là định nghĩa của $( -1hoặc %) không thay đổi, vì rsortchức năng của tôi vẫn đang gọi biểu tượng toàn cầu $. Sẽ thật tuyệt khi có thể nói "hãy rsortlàm những gì $-1%hiện đang làm, ngay cả khi những biểu tượng đó sau đó được xác định lại."

Đặc biệt, thư viện tiêu chuẩn có thể sử dụng loại ràng buộc này. Thật đáng ngạc nhiên khi nhận ra rằng, việc thay đổi nsẽ thay đổi hành vi putshoặc việc xác định lại !hoàn toàn gây rối xor. (Sau đó, một lần nữa, cần thận trọng ở đây, vì, đặc biệt, khả năng thay đổi hành vi của putshóa ra hóa ra là cách duy nhất để tránh in một dòng mới cuối cùng trong phiên bản hiện tại của GS.)

Chỉnh sửa: Có thể biến các biểu tượng trở lại thành các khối mã sẽ đi một chặng đường dài để thực hiện chức năng này. Cụ thể, {foo}_cú pháp được đề xuất trong câu trả lời đó sẽ thực hiện hiệu quả một mức ràng buộc tĩnh bằng cách mở rộng tất cả các biểu tượng trong một khối mã. Kết hợp điều đó với một tổ hợp điểm cố định để liên kết tĩnh sâu và Bob là chú của bạn ...


Thôi nào - tất cả các ngôn ngữ mới lạ mắt đều ăn mừng đánh giá lười biếng ;-) Hãy giữ tính năng đó trong GolfScript.
Howard

Về ý nghĩ thứ hai - bạn nói đúng, đó là một tính năng ràng buộc hơn là đánh giá. Nhưng sau đó - liên kết tĩnh phức tạp hơn âm thanh - ví dụ: cung cấp các cuộc gọi đệ quy bên trong một định nghĩa.
Howard

"Hãy rsortlàm những gì $-1%hiện đang làm, ngay cả khi những biểu tượng đó sau đó được định nghĩa lại" Vậy Emmental?
Máy

0

Nhiều chức năng tích hợp

Làm cho tất cả các biến một chữ cái az và AZ thực hiện một số hàm chung, hữu ích. Một số phần mềm tích hợp còn thiếu:

  • tối thiểu và tối đa: tất cả hoặc một số giá trị ngăn xếp 2 đầu, giá trị ngăn xếp n trên cùng, trên một mảng
  • giá trị tuyệt đối
  • tổng và sản phẩm của một mảng. tại sao làm {+}*khi bạn có thể làmS ? Bạn có 52 chức năng để làm việc ở đây!
  • Khoảng cách Manhattan (tức là x1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1). Bây giờ nó phải là@-A@@-A+ nếu Alà một built-in giá trị tuyệt đối Cấp này chỉ vỏn vẹn caues của tôi. Bài nhất gần đây nhưng tôi luôn luôn tìm thấy sẽ là một cách tốt để mở rộng golfscript: ghi xuống những gì các chức năng sẽ có ích để có, thu thập chúng và thêm chúng dưới dạng tích hợp.
  • Chuyển đổi một số nguyên thành chuỗi một ký tự (tương đương với python chr ).
  • Tràn một chuỗi lên ngăn xếp (hiện tại {}/ )
  • Một phiên bản của : tiêu thụ những gì được lưu trữ. Điều này sẽ không bị 'kẹt' để định danh trở nên hữu ích.
  • Toán tử cho >= ,<=
  • Như ai đó đã đề xuất, một cách để đặt một biến chứa một khối lên ngăn xếp mà không thực hiện nó. Vì vậy, bạn có thể giảm ifs của mẫu1{\}{|}if một cái gì đó như1?\?|if
  • Chuyển đổi cơ sở tích hợp 64 và hỗ trợ zlib để làm cho việc nhúng dữ liệu mất ít ký tự hơn
  • Ngoài Base64, tạo mã hóa base93 tùy chỉnh (sử dụng tất cả các ký tự có thể in không phải là dấu phân cách chuỗi).
  • Các phím tắt cho 1$, 2$, 3$, 4$,5$
  • Một toán tử để sao chép hai mục ngăn xếp trên cùng, nghĩa là \.@.@\

-3

Sẽ thật tuyệt nếu giá trị được ghi hoặc tính trong dòng cuối cùng của hàm được tự động trả về


3
Đó là dựa trên ngăn xếp, vì vậy ...
bến tàu

1
Không có thứ gọi là chức năng.
Peter Taylor

Các hàm không trả lại bất cứ thứ gì ... và chúng được gọi là các khối
Doorknob

Điều đó có thể tốt ... trong một số ngôn ngữ khác. (Báo cáo trở lại Không gây phiền nhiễu hơn ở phần cuối của chức năng Yay (Nhưng tôi đã không cần tuyên bố trở lại bao giờ, vì vậy ...)!)
CalculatorFeline
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.