ล่ามแปลภาษาด้วยตนเอง


25

จากความคิดเห็นของ George Edison สำหรับคำถามนี้ให้เขียนล่ามแปลภาษาที่เล็กที่สุดด้วยตนเอง

  • คุณอาจใช้ภาษาที่คุณเลือก
  • ภาษาที่ว่างเปล่าจะไม่ถูกนับ โปรแกรมของคุณต้องมีอักขระอย่างน้อยสองตัว
  • โปรแกรมไม่จำเป็นต้องแปลทั้งภาษาเพียงคุณสมบัติย่อยของทัวริงที่สมบูรณ์ (ซึ่งมีตัวแปลภาษา)
  • Quines จะไม่นับ
  • อย่าใช้evalฟังก์ชั่นในตัวหรือเทียบเท่า กันไปเพื่อapplyฯลฯ

1
(อืม .. ฉันควรทำอะไรด้วย/usr/bin/cat) แล้วทัวริงสมบูรณ์ไหม
Ming-Tang

@ SHiNKiROU: ขอบคุณฉันไม่คิดว่าเป็นการทดสอบ Updated
Hoa Long Tam

ที่เกี่ยวข้อง: ภาษาที่มีล่ามน้อยที่สุดที่เขียนด้วยตัวเองใน Stack Overflow แต่มีคำตอบเพียงไม่กี่คำเท่านั้นที่ปฏิบัติตามกฎที่ให้ไว้ที่นี่
dmckee

1
เราต้องเขียนใหม่ว่า Scheme sexp parser หรือเราจะพิจารณาภาษาของโฮสต์ได้ไหม
JB

@JB: โปรแกรมอรรถประโยชน์การประมวลผลสตริงของภาษานั้นใช้ได้ดีรวมถึงsexpparser
Hoa Long Tam

คำตอบ:


19

CI - 260

,(1p0(2d())(41(2d())('#((1p0()(10()(1d,1p$)=)<)$2d,1p$)(40(1d,1c$^)(''(1d,^)('0
'9('0-(,'0'9('0-2p10*+1p$)(!1d)~)$^)(0($)'$(^)'^(&)'&(c)'c(p)'p(d)'d(=)'=(<)'<(
>)'>(~)'~(.)'.(,)',(!)'!(+)'+(-)'-(*)'*(/)'/(%)'%()38p(1p3p0(3d)((2)(3)=p1d1p$)
=)$)~)=)=,2p$&)=)=)<)$$

320 → 260:ดันการแมปคำสั่งแบบอักขระอย่างง่ายจากนั้นพับทับ การทำเช่นนี้จะลดขนาดรหัสต่อกรณี (มี 18 กรณี) แต่จะมีค่าใช้จ่าย 30 ตัวที่จะทำการพับ

นี่เป็นอีกหนึ่งภาษาที่ฉันสร้างขึ้น (ล่ามพื้นฐานโฮสต์ใน Gist ) มีความเป็นเอกลักษณ์ในการที่ภาษานำเศษรหัสมาใช้อีกครั้ง นั่นคือสตริงคำสั่งในภาษาที่ใช้สแต็กนี้จะใช้เพื่อให้มีผลเช่นเดียวกับโครงสร้างข้อมูลหรือการปิดในภาษาอื่น:

1^      # Push a 1, and "lift" it to be a code literal.
(5 +)   # Define a code literal.
&       # Join the two code literals, forming (1 5 +)
$       # Execute the code literal.

ล่ามจะสร้างส่วนย่อยของรหัสทั้งหมดของโปรแกรมก่อนที่จะเรียกใช้ดังนั้นจึงสามารถพิจารณาได้ว่าเป็นคอมไพเลอร์ ด้วยเหตุนี้การซ้อนล่ามจึงไม่ทำให้เกิดโอเวอร์เฮดแบบรันไทม์แบบเอ็กซ์โปเนนเชียล

ล่ามมาทั้งหมดของผู้ประกอบการโดยตรงจากล่ามโฮสต์ อย่างไรก็ตามมันทำการแยกวิเคราะห์ด้วยตัวเองดังนั้นส่วนใหญ่ของรหัสเป็นเพียงลำดับที่แปลอักขระเป็นตัวอักษรรหัสตามลำดับของพวกเขา สิ่งนี้ไม่เหมือนกับการใช้evalแต่มันแสดงให้เห็นว่าการใช้งานภาษาโปรแกรมใดขึ้นอยู่กับความหมายของภาษา / สถาปัตยกรรมโฮสต์


การอ้างอิงภาษา:

รับล่ามที่นี่

บล็อก

  • ( ... )

    สร้าง "บล็อก" ซึ่งเป็นรายการคำสั่งอย่างมีประสิทธิภาพโดยไม่มีบริบท ภายในก็อาจเป็นรหัสเครื่อง

  • กลุ่ม $

    เรียกบล็อก ผู้ถูกส่งมอบกองซ้อนส่วนกลางซึ่งรวมถึงบล็อกที่ถูกเรียก

  • ราคา ^

    ยกคุณค่า กล่าวคือเปลี่ยนเป็นบล็อกที่ผลักดันค่านั้น

    ตัวอย่าง :

       1 ^
    == (1)
    
  • block1 block2 &

    เข้าร่วมสองบล็อกสร้างหนึ่งที่ทำงานทั้งสองในลำดับ

    ตัวอย่าง :

       (1) (2) &
    == (1 2)
    

การจัดการกองซ้อน

  • n c

    คัดลอกค่า nth ของสแต็ก

    ตัวอย่าง :

       5 4 3 2 1 0 3c
    == 5 4 3 2 1 0 3
    
  • n p

    ถอนค่าที่ n ของสแต็ก (เอาออกแล้วนำมาไว้ด้านหน้า)

    ตัวอย่าง :

       5 4 3 2 1 0 3p
    == 5 4 2 1 0 3
    
  • n d

    ปล่อยค่า n จากสแต็ก 0dเป็น no-op

    ตัวอย่าง :

       5 4 3 2 1 0 3d
    == 5 4 3
    

ผู้ประกอบการเชิงสัมพันธ์

  • ab (on_true) (on_false) =

    ทดสอบว่า a เท่ากับ b กินทั้งหมดยกเว้นอาร์กิวเมนต์แรกและเรียกใช้ on_true หรือ on_false หากอาร์กิวเมนต์หนึ่งมีค่าเป็นศูนย์และอีกประเภทเป็นประเภทอื่นผลลัพธ์จะเป็นเท็จ มิฉะนั้น a และ b ต้องเป็นจำนวนเต็ม

    ตัวอย่าง :

       3 3 ('0+ .) (1d) =
    == 3 '0+ .
    
  • ab (on_true) (on_false) <

    ทดสอบว่า a น้อยกว่า b หรือไม่ a และ b ต้องเป็นจำนวนเต็ม

    ตัวอย่าง :

       3 5 (1d 5) () <
    == 3 1d 5
    == 5
    
  • ab (on_true) (on_false) >

    ทดสอบว่า a มากกว่า b หรือไม่ a และ b ต้องเป็นจำนวนเต็ม

    ตัวอย่าง :

       3 5 (1d 5) () >
    == 3
    
  • สวัสดี (on_true) (on_false) ~

    ทดสอบว่าแท้จริง <= a <= สวัสดี a, lo และ hi ต้องเป็นจำนวนเต็ม

    ตัวอย่าง :

       3 0 10 ('0+ .) (1d) ~
    == 3 '0+ .
    

I / O

  • .

    ใส่ตัวอักษร c (ใช้มันจากกอง)

  • ,

    รับตัวละครแล้วผลักไปที่กองซ้อน หากถึงจุดสิ้นสุดของไฟล์แล้ว -1 จะถูกผลัก

  • !

    ปลดปล่อยตัวละคร เช่นเดียวกับ ungetc ใน C อนุญาตให้กดได้เพียงครั้งเดียว

ตัวอักษรจำนวนเต็ม

  • 'c

    ผลักดันตัวละครค

  • [0-9] +

    กดจำนวนเต็มทศนิยม

คณิตศาสตร์

  • AB +
  • AB -
  • AB *

    เพิ่ม / ลบ / คูณสองตัวเลข

    ตัวอย่าง :

       3 5 + 7 3 + *
    == 80
    
  • AB /

  • AB %

    กองและโมดูลัส ไม่เหมือนใน C รอบนี้ไปทางลบอนันต์

เบ็ดเตล็ด

  • #ความคิดเห็นรหัส

    #ตัวละครที่แสดงความคิดเห็นออกมาทุกอย่างถึงจุดสิ้นสุดของเส้น

  • )

    ใช้เพื่อวางบล็อก สามารถใช้เพื่อจบโปรแกรมทั้งหมดได้เช่นกัน

  • อักขระอื่น ๆ ทั้งหมดจะถูกละเว้น


24

แคลคูลัสแลมบ์ดาไบนารี 232 บิต (29 ไบต์)

0101000110100000000101011000000000011110000101111110011110000101110011110000001111000010110110111001111100001111100001011110100111010010110011100001101100001011111000011111000011100110111101111100111101110110000110010001101000011010

ดู http://en.wikipedia.org/wiki/Binary_lambda_calculus#Lambda_encoding เพื่อดูรายละเอียด


2
ทำไมนี่ไม่ใช่คำตอบที่ได้รับการยอมรับ D: BLC วิเศษมาก!
แมว

คุณสามารถอธิบายได้ทั้งหมดหรือไม่
PyRulez

1
น่าเสียดายที่ Wikipedia ลบหน้า Binary Lambda แคลคูลัส หน้าtromp.github.io/cl/cl.htmlของฉันเชื่อมโยงไปยังสำเนาที่สงวนไว้และไปยังกระดาษที่ฉันเขียนอธิบายการทำงานของล่าม
John Tromp

13

ฉันไม่สามารถเครดิตสำหรับสิ่งนี้ได้แต่ฉันคิดว่าฉันจะแบ่งปันสิ่งที่น่าอัศจรรย์นี้:

สมอง (***) 423

>>>+[[-]>>[-]++>+>+++++++[<++++>>++<-]++>>+>+>+++++[>++>++++++<<-]+>>>,<++[[>[
->>]<[>>]<<-]<[<]<+>>[>]>[<+>-[[<+>-]>]<[[[-]<]++<-[<+++++++++>[<->-]>>]>>]]<<
]<]<[[<]>[[>]>>[>>]+[<<]<[<]<+>>-]>[>]+[->>]<<<<[[<<]<[<]+<<[+>+<<-[>-->+<<-[>
+<[>>+<<-]]]>[<+>-]<]++>>-->[>]>>[>>]]<<[>>+<[[<]<]>[[<<]<[<]+[-<+>>-[<<+>++>-
[<->[<<+>>-]]]<[>+<-]>]>[>]>]>[>>]>>]<<[>>+>>+>>]<<[->>>>>>>>]<<[>.>>>>>>>]<<[
>->>>>>]<<[>,>>>]<<[>+>]<<[+<<]<]

10

BlockScript - 535

{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;

BlockScript เป็นภาษาสปาเก็ตตี้เรื่องไม่สำคัญที่ฉันสร้างขึ้นสำหรับความท้าทายนี้โดยเฉพาะ ล่ามฐานblockscript.c

โปรแกรมตัวอย่าง (พิมพ์หมายเลข Fibonacci 15 หมายเลขแรก):

{[B?B10/A!B10%d&:0}
{[B0<?'-.0B-A!:{B?Bh!{[B?B[A]A!B[B]'0+.:}!:'0.}!10.}
{[B?Dd!DC+B1-CecA!:}
0 1 15d!
;

ล่ามจะอ่านทั้งซอร์สโค้ดและอินพุตโปรแกรมจากอินพุตมาตรฐานตามลำดับนั้น ซึ่งหมายความว่าการเรียกใช้ล่ามภายในล่ามภายในล่ามเพียงคัดลอกและวาง:

# Level 1
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;

# Level 2
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;

# Level 3
{[B?B10/A!B10%d&:0}
{[B0<?'-.0B-A!:{B?Bh!{[B?B[A]A!B[B]'0+.:}!:'0.}!10.}
{[B?Dd!DC+B1-CecA!:}
0 1 15d!
;

เช่นเดียวกับภาพยนตร์Inceptionคุณแทบจะไม่สามารถเจาะลึกลงไปกว่าสามระดับ มันไม่ใช่เรื่องของเวลา แต่เป็นเรื่องของพื้นที่ BlockScript มีหน่วยความจำรั่วไหลอย่างมากมายและสิ่งนี้เกี่ยวข้องกับวิธีการออกแบบภาษาของตัวเอง


การอ้างอิงภาษา:

รับล่ามที่นี่

ใน BlockScript "stack" ไม่ใช่อาเรย์ที่ถูกเขียนทับโดยการดำเนินการที่ตามมาอย่างที่คุณอาจคุ้นเคย มันถูกนำมาใช้จริงเป็นรายการเชื่อมโยงที่ไม่เปลี่ยนรูปและสแต็คยังคงอยู่ในช่วงระยะเวลาของโปรแกรม นอกจากนี้ไม่มีตัวดำเนินการ (ยกเว้น@) ลบค่าออกจากสแต็ก อย่างไรก็ตามการแก้ไขสแต็กจะมีผลกับบล็อกที่เกิดขึ้นเท่านั้น

การเลือกค่า

  • a ตลอด z

    ดึงรายการ 0-25 จากสแต็กและผลักไปที่สแต็ก aอ้างถึงส่วนหัวหรือรายการที่ผลักดันล่าสุดของสแต็ก

  • A ตลอด Z

    ดึงรายการ 0-25 ของเฟรมปัจจุบันแล้วดันไปที่สแต็ก

  • [

    เปิด "frame" เพื่อเลือกรายการจากการอ้างอิงสแต็ก (ดูด้านล่าง) ที่ส่วนหัวของสแต็ก [ไม่จำเป็นต้องมีการจับคู่]แต่เฟรมถูกกำหนดขอบเขตไว้เล็กน้อย ใน BlockScript "ขอบเขต" ถูกกำหนดโดยเครื่องหมายวงเล็บปีกกา ( {... }) ที่ฟอร์มบล็อก ดังนั้นการเปิดเฟรมภายในบล็อกจะไม่มีผลกับโค้ดภายนอกบล็อก

  • ]

    ปิดเฟรมปัจจุบันกลับไปที่เฟรมก่อนหน้า (ถ้ามี)

บล็อก

  • { ... }

    สร้าง "บล็อก" และกดไปที่สแต็ก ภายในบล็อกสแต็กจะเริ่มต้นในสิ่งที่อยู่ก่อนหน้าบล็อกยกเว้นสแต็กของผู้โทรจะถูกผลักด้านบน สแต็กจะคงอยู่และไม่เปลี่ยนรูปใน BlockScript ดังนั้นบล็อกจึงปิด สำนวน{[หมายถึงเปิดบล็อกจากนั้นเปิดเฟรมเพื่อเริ่มเลือกอาร์กิวเมนต์ (ใช้Aผ่านZ) ค่าส่งคืนของบล็อกคือส่วนหัวของสแต็กเมื่อ}ถึง

    ตัวอย่าง:

    '3 '2 '1 {[ b. d. f. B. C. D. A! } 'D 'C 'B d!;
    

    งานพิมพ์123BCD123DCB123BCD123DCB…นี้ ตัวอักษรตัวเล็กอ้างถึงค่าสแต็กในขณะที่ตัวอักษรตัวพิมพ์ใหญ่อ้างถึงข้อโต้แย้ง (เนื่องจากเฟรมถูกตั้งค่าเป็นสแต็กของผู้โทร) A!ใช้หัวของผู้โทร (ซึ่งรับประกันว่าจะเป็นบล็อกที่ถูกเรียก) และเรียกมัน หากคุณสงสัยว่าทำไมมันถึงกลับกันBCDทุกครั้งมันเป็นเพราะB. C. D.ผลักดันข้อโต้แย้งเหล่านั้นในลำดับย้อนกลับทันทีก่อนที่บล็อกจะเรียกตนเอง

  • !

    เรียกบล็อก กดค่าส่งคืนไปยังสแต็ก

การอ้างอิงสแต็ก

  • &

    สร้างการอ้างอิงสแต็กและกดไปที่สแต็ก คิดว่านี่เป็น "super-cons" เพราะมันจะนำทุกรายการในสแต็คอย่างมีประสิทธิภาพและสร้าง "tuple" ออกมาจากมัน สำนวน&[หมายถึงว่าสิ่งที่a, b, cเรียกว่าก่อนหน้านี้สามารถเข้าถึงได้ด้วยA, B, C(สำหรับส่วนที่เหลือของบล็อกหรือจนกว่า]จะพบ)

    ส่วนหนึ่งเป็นเพราะ&ค่ามากกว่าที่ปกติต้องการ BlockScript รั่วหน่วยความจำโดยการออกแบบ

  • @

    สลับไปยังสแต็กที่ชี้ไปตามการอ้างอิงสแต็aก ตัวดำเนินการนี้ค่อนข้างแปลก แต่ตัวแปลภาษาด้วยตนเองของ BlockScript ใช้สองสามครั้งเพื่อหลีกเลี่ยงการกดอาร์กิวเมนต์เดียวกันสองครั้ง ผลกระทบของ@(หรือการดำเนินการสแต็กใด ๆ สำหรับเรื่องนั้น) จะถูก จำกัด อยู่ที่บล็อกที่ถูกเรียกใช้ นอกจากนี้เฟรมยังไม่ได้รับผลกระทบ@ดังนั้นจึงสามารถใช้เฟรมเพื่อจับค่าที่คุณต้องการหลังจากสลับสแต็ก

การแสดงออกตามเงื่อนไข

  • ? <บนจริง> : <เป็นเท็จ>

    นิพจน์เงื่อนไขเช่นเดียวกับผู้ประกอบการที่ประกอบไปด้วยใน C. นั่นคือถ้าaเป็น "จริง" (นั่นคือไม่เท่ากับจำนวนเต็มศูนย์) แล้วทำ<ในความจริง>มิฉะนั้นทำ<บนเท็จ>

I / O

หมายเหตุ: อินพุตและเอาต์พุตเสร็จสิ้นใน UTF-8 "ตัวอักษร" เป็นจำนวนเต็มที่สอดคล้องกับดัชนี Unicode

  • ,

    รับอักขระอินพุตถัดไปและกดไปที่สแต็ก หากถึงจุดสิ้นสุดของอินพุตให้กด -1 แทน

  • .

    เอาท์พุทตัวละครบนหัวของสแต็ค

ตัวอักษรจำนวนเต็ม / ตัวอักษร

หมายเหตุ: จำนวนเต็มและตัวอักษรเป็นสิ่งเดียวกันใน BlockScript

  • 'c

    ผลักดันตัวละครค

  • [0-9] +

    กดจำนวนเต็มทศนิยม

คณิตศาสตร์

ตัวดำเนินการเหล่านี้ใช้งานได้กับค่าจำนวนเต็มเท่านั้น

  • +คำนวณb+ a(ผลักผลลัพธ์ แต่ไม่ทิ้งค่าใดค่าหนึ่ง)
  • -คำนวณb- a.
  • *Compute *ba
  • /คำนวณb/ a(การหารจำนวนเต็มปัดเศษไปทางอนันต์ลบ)
  • %คำนวณb% a(โมดูลัสจำนวนเต็ม; ปัดเศษไปทางอนันต์ลบ)

ผู้ประกอบการเชิงสัมพันธ์

ตัวดำเนินการเหล่านี้ใช้งานได้กับค่าจำนวนเต็มเท่านั้น

  • <ถ้าbน้อยกว่าaให้กด 1 และกด 0 อีกครั้ง
  • >
  • =

เบ็ดเตล็ด

  • # แสดงความคิดเห็นถึงจุดสิ้นสุดของบรรทัด
  • โปรแกรมจะต้องจบด้วย ;
  • อักขระอื่น ๆ ทั้งหมดจะถูกละเว้น

2
คริสต์ สนใจแบ่งปันข้อมูลจำเพาะเหมือนที่คุณทำกับ CI หรือไม่
Casey

@Casey: เพิ่มการอ้างอิง
Joey Adams

1
คุณสนใจที่จะรู้ว่าคุณกำลังฝันอยู่หรือไม่? ... ที่ระดับ 4
Mateen Ulhaq

3

Zozotez LISP : 414

เพิ่ม linefeeds เพื่อรับบล็อกที่ดีไม่จำเป็นและไม่ถูกนับ

((\(E V A L)(E(r)'(())))(\(x e)(?(s x)(V x e)((\(b j)(?(= b ")(a j)(?(= b \)x
(?(= b ?)(?(E(a j)e)(E(a(d j))e)(E(a(d(d j)))e))(?(s b)(A b(E(a j)e)(E(a(d j)
)e))(E(a(d(d b)))(L(a(d b))j e)))))))(E(a x)e)(d x))))(\(x g)(? g(?(= x(a(a
g)))(d(a g))(V x(d g)))x))(\(f h v)(?(= f r)(r)(?(= f p)(p h)(?(= f s)(s h)(?
(= f a)(a h)(?(= f d)(d h)(?(= f =)(= h v)(c h v))))))))(\(k v i)(? k(L(d k)(
d v)(c(c(a k)(E(a v)i))i))i)))

ในทางทฤษฎีมันควรจะสามารถทำงานได้เอง แต่เนื่องจากล่ามดั้งเดิมเป็นไบนารีBrainFuckและเป็นล่ามฉันจึงสามารถทดสอบแต่ละส่วนได้เท่านั้น เมื่อได้รับตัวเองและการแสดงออกที่เรียบง่าย(p p)ฉันคิดว่ามันต้องใช้เวลามากกว่า 40 นาทีที่ฉันรอจนถึงตอนนี้และฉันใช้ความเร็วjitbfในการรันซึ่งผิดพลาดที่ใช้ Perl Inline-C เพื่อรันโค้ด C ทันที

เป็นไปไม่ได้ที่จะใช้งาน Zozotez ทั้งหมดใน Zozotez เนื่องจากไม่มีวิธีการกลายพันธุ์ข้อเสียและ:(setq / define) จำเป็นต้องมีเพื่ออัปเดตการเชื่อมโยง ฉันยังไม่ได้ใช้การเริ่มต้น / progn หรือ & อาร์กิวเมนต์ที่เหลือมาโครและอาร์กิวเมนต์การพิมพ์พิเศษอย่างชัดเจนเนื่องจากฉันไม่ได้ใช้มันในล่าม ฉันรวมp(พิมพ์) แม้ว่าฉันจะไม่ได้ใช้ดังนั้นโปรแกรมจำเป็นต้องพิมพ์การคำนวณของพวกเขาอย่างชัดเจนเหมือนกับล่ามดั้งเดิม

ungolfed เดียวกัน:

;; A stand alone Zozotez script need to be
;; contained in one expression, here with
;; all functions provided as arguments to
;; get them bound in the dynamic environment
((\ (E V A L)
  (E(r)'(())))
 ;; E (EVAL)
 (\ (x e)
   (? (s x)
      (V x e)
      ((\ (b j)
         (? (= b ") (a j)
         (? (= b \) x
         (? (= b ?) (? (E(a j)e) (E(a(d j))e) (E(a(d(d j)))e))
         (? (s b)
            (A b (E(a j)e) (E (a(d j))e))
            (E (a(d(d b))) (L(a(d b))j e)))))))
       (E (a x) e)(d x))))
 ;; V (VALUE / symbol->value)
 (\ (x g)
   (? g
      (? (= x (a (a g)))
         (d (a g))
         (V x (d g)))
      x))
 ;; A (APPLY) but just for primitives
 (\ (f h v)
   (? (= f r) (r)
   (? (= f p) (p h)
   (? (= f s) (s h)
   (? (= f a) (a h)
   (? (= f d) (d h)
   (? (= f =)
      (= h v)
      (c h v))))))))
 ;; L ( joint evLis / extend-env)
 (\ (k v i)
   (? k
      (L (d k) 
         (d v)
     (c (c (a k) 
           (E (a v) i)) 
        i))
      i)))

0

CHIQRSX9 + (อาจไม่ใช่การแข่งขัน), 2 ไบต์

+I

ไม่มีวิธีในการเขียนล่ามแปลภาษาด้วยตนเองในภาษาHQ9 + - เบสนี้โดยไม่ใช้Iซึ่งใช้ล่ามในตัวที่ประมวลผล STDIN


1
ไม่มีกฎใดบอกว่าล่ามในตัวไม่ได้รับอนุญาต มันบอกว่าสำหรับevalนิพจน์ไม่ใช่โปรแกรม
Erik the Outgolfer

การคำนวณหนึ่งครั้งในภาษานี้เป็นอย่างไร
pppery

@ppperry Xควรจะทำให้ภาษาทัวริงสมบูรณ์ (จึงสามารถคำนวณจำนวนเฉพาะ) ในลักษณะขึ้นอยู่กับการใช้งาน
user8397947

ตามหน้า Esolang Xคำสั่งของล่ามภาษา Perl จะสุ่มโปรแกรมและเรียกใช้งานซึ่งหมายความว่าไม่สามารถใช้คำสั่งเพื่อคำนวณค่าใช้จ่าย คุณช่วยให้ฉันตัวอย่างล่ามที่ช่วยให้คุณใช้Xในวิธีที่คุณระบุ?
pppery

@ppperry เห็นได้ชัดว่าล่ามที่เขียนด้วย Perl เป็นล่ามตัวเดียวดังนั้นจึงไม่มี นอกจากนี้จะเกิดอะไรขึ้นถ้ามีโปรแกรมที่คำนวณเฉพาะช่วงเวลาเมื่อ "สุ่ม" ด้วยค่าเฉพาะ
user8397947

0

ระบบไฟล์พร้อมกัน Befunge 98 - 53 \ 18 ไบต์ (โกงเกือบแน่นอน)

ล่าม 53 ไบต์แบบเต็มโดยไม่มีข้อ จำกัด (แม้ว่าฉันยังไม่ได้ทดสอบการโต้ตอบช่วงเวลาที่ซับซ้อนเกี่ยวกับการแยกและตัด IP)

v ;;;;;;;;
>]390'ai@
 t;;;;;;;;
;>zzzzz#;

อ่านอินพุตจากไฟล์ที่ชื่อaและเรียกใช้งาน มันไม่ได้ระบุไว้ในกฎที่เราไม่สามารถใช้รหัสการแก้ไขด้วยตนเอง

18 ไบต์ล่ามที่ไม่อนุญาตให้มีการห่อ (IP ย้ายของขอบหนึ่งของรหัสและเริ่มต้นที่ขอบตรงข้าม):

]210'ai@
t
><
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.