鱼C论坛

 找回密码
 立即注册
查看: 2247|回复: 18

[技术交流] Python 编写一门“编程语言”

[复制链接]
发表于 2020-4-3 19:22:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Robot_Steve 于 2021-11-10 21:50 编辑

最近闲来无事,想着办法“玩”

于是写了一个“编程语言”,至少满足了编程语言三大特性:
1. 变量
2. 函数
3. 关键字


注:部分东西没有加上,如:函数的参数不是一个变量

先上源码(GUI 由 tkinter 完成):

  1. import tkinter.messagebox as msg
  2. from tkinter import *

  3. root = Tk() # 创建主窗口
  4. root.title("Title") # 设置标题
  5. root.geometry("550x340+370+240") # 设置窗口大小
  6. root.resizable(0, 0) # 设置窗口的尺寸不可改变

  7. # 菜单
  8. mb = Menu(root)
  9. root.config(menu=mb)

  10. # 定义 “主区块” 类
  11. class WinMian:
  12.     def __init__(self):
  13.         self.home()
  14.     def home(self):
  15.         self.homefrome = Frame(root, bg="Black", width=530,height=340)
  16.         self.homefrome.place(x=0,y=0)
  17.         # 命令框
  18.         self.text = Text(self.homefrome, width=74, height=20, bg="LightSlateGray",
  19.                          fg="White")
  20.         self.text.place(x=3,y=3)
  21.         self.jg = Text(self.homefrome,width=74,height=5, bg="LightSlateGray")
  22.         self.jg.place(x=3,y=270)

  23.         def run(): # 运行函数
  24.             commands_texts = (self.text.get("0.0","end").replace("\t","")).split("\n")
  25.             commands_texts.pop()

  26.             function_list = []  # 储存函数名
  27.             function_drit = {}  # 储存函数相对应的参数
  28.             function_code_drit = {}  # 储存函数相对应的代码
  29.             global_var = {}
  30.             local_var  = {}

  31.             def RunMainStartFunction(infunction=False, code=None, functionname=None,
  32.                                      parmeter=None):
  33.                 global functioncode, parmeters_lens
  34.                 # print("Coommands",commands_text)
  35.                 # 定义关键字
  36.                 def hhh(name):
  37.                     name_list = []
  38.                     error = False
  39.                     for w2 in name:
  40.                         name_list.append(w2)

  41.                     commandd = list(commands_text[0])
  42.                     while name_list != []:
  43.                         if name_list[0] == commandd[0]:
  44.                             name_list.pop(0)
  45.                             commandd.pop(0)
  46.                         else:
  47.                             msg.showerror("Error", "SyntaxError"+"\nThe Wrong: "+commands_texts[0])
  48.                             error = True
  49.                             break
  50.                     # print(commandd)
  51.                     return_list = []
  52.                     if error == False:
  53.                         string = ""
  54.                         while commandd != []:
  55.                             # print(commandd)
  56.                             if commandd[0] != "^":
  57.                                 string = string + commandd[0]
  58.                                 commandd.pop(0)

  59.                                 if commandd == []:
  60.                                     return_list.append(string)
  61.                                     break
  62.                             else:
  63.                                 return_list.append(string)
  64.                                 string = ""
  65.                                 commandd.pop(0)
  66.                                 if commandd == []:
  67.                                     break

  68.                     return return_list
  69.                 if infunction == True:
  70.                     commands_text = code
  71.                     if "pm:" in commands_text[0]:
  72.                         r = hhh("pm:")
  73.                         functionparmeter = function_drit[functionname]
  74.                         get_parmeters_list = functionparmeter.keys()
  75.                         parmeters_list = []
  76.                         for w5 in get_parmeters_list:
  77.                             parmeters_list.append(w5)  # 将键(函数参数)存入列表
  78.                         parmeters_list_lens = len(parmeters_list)  # 函数参数长度
  79.                         set_parmeters_lens = len(r)  # 设置参数的长度
  80.                         # print(parmeters_list, parmeters_list_lens, set_parmeters_lens)
  81.                         if set_parmeters_lens == parmeters_list_lens:  # 当长度符合条件时...
  82.                             while r != []:
  83.                                 if r[0] == "None":  # 当用户放弃设置当前参数时,恢复默认(None)
  84.                                     function_drit2 = function_drit[functionname]
  85.                                     function_drit2[parmeters_list[0]] = None
  86.                                     function_drit[functionname] = function_drit2
  87.                                     r.pop(0)
  88.                                     parmeters_list.pop(0)
  89.                                 else:
  90.                                     function_drit2 = function_drit[functionname]
  91.                                     function_drit2[parmeters_list[0]] = r[0]
  92.                                     function_drit[functionname] = function_drit2
  93.                                     r.pop(0)
  94.                                     parmeters_list.pop(0)
  95.                             commands_text.pop(0)
  96.                         else:
  97.                             msg.showerror("Error", "ParameterSettingFailedError"+"\nThe Wrong: "+commands_texts[0])

  98.                     functionparmeters = function_drit[functionname]
  99.                     if functionparmeters != None:
  100.                         get_parmeters = functionparmeters.keys()
  101.                         parmeterslist = []
  102.                         for w5 in get_parmeters:
  103.                             parmeterslist.append(w5)
  104.                         parmeters_lens = len(parmeterslist)  # 参数长度
  105.                         parmeter_lens = len(parmeter)
  106.                         parmeterslist2 = parmeterslist.copy()
  107.                         while parmeterslist2 != []:
  108.                             if functionparmeters[parmeterslist2[0]] == None:
  109.                                 parmeterslist2.pop(0)
  110.                             else:
  111.                                 parmeterslist2.pop(0)
  112.                                 parmeters_lens = parmeters_lens - 1
  113.                         if parmeters_lens == parmeter_lens:
  114.                             while parmeter != []:
  115.                                 functionparmeters[parmeterslist[0]] = parmeter[0]
  116.                                 parmeter.pop(0)
  117.                                 parmeterslist.pop(0)
  118.                         else:
  119.                             msg.showerror("Error", "SyntaxError"+"\nThe Wrong: "+commands_texts[0])
  120.                 else:
  121.                     # ...
  122.                     commands_text = commands_texts.copy()

  123.                 # 运行  函数
  124.                 # print(commands_text)
  125.                 true  = "True"
  126.                 false = "False"
  127.                 while commands_text != []:
  128.                     if "printf:" in commands_text[0]:
  129.                         r = hhh("printf:")
  130.                         string = r[0]

  131.                         while "/b" in string: # 转移符捕捉
  132.                             string_list = list(string)
  133.                             hindex = string_list.index("/")

  134.                             if string_list[hindex + 1] == "b":
  135.                                 string_list.pop(hindex)
  136.                                 string_list.pop(hindex)
  137.                                 string_list.insert(hindex, "\n")
  138.                                 import_str = ""
  139.                                 for w3 in string_list:
  140.                                     import_str = import_str + w3

  141.                                 string = import_str
  142.                         # print(r)
  143.                         if string in global_var:
  144.                             if len(r) == 1:
  145.                                 self.jg.insert(END, str(global_var[string][1]) + "\n")
  146.                             if len(r) == 2:
  147.                                 if r[1] in global_var:
  148.                                     self.jg.insert(END, str(global_var[string][1]) + str(global_var[r[1]][1]))
  149.                                 elif r[1] in local_var:
  150.                                     self.jg.insert(END, str(global_var[string][1]) + str(local_var[r[1]][1]))
  151.                                 else:
  152.                                     self.jg.insert(END, r[0] + r[1])
  153.                         elif string in local_var:
  154.                             yesglobal = local_var[string][2]
  155.                             print(yesglobal)
  156.                             if infunction == True:
  157.                                 if yesglobal == functionname or yesglobal == None:
  158.                                     if len(r) == 1:
  159.                                         self.jg.insert(END, str(local_var[string][1]) + "\n")
  160.                                     if len(r) == 2:
  161.                                         if r[1] in global_var:
  162.                                             self.jg.insert(END, str(local_var[string][1]) + str(global_var[r[1]][1]))
  163.                                         elif r[1] in local_var:
  164.                                             self.jg.insert(END, str(local_var[string][1]) + str(local_var[r[1]][1]))
  165.                                         else:
  166.                                             self.jg.insert(END, r[0] + r[1])
  167.                                 else:
  168.                                     msg.showerror("Error","NameError")
  169.                             else:
  170.                                 if yesglobal == None:
  171.                                     if len(r) == 1:
  172.                                         self.jg.insert(END, str(local_var[string][1]) + "\n")
  173.                                     if len(r) == 2:
  174.                                         if r[1] in global_var:
  175.                                             self.jg.insert(END, str(local_var[string][1]) + str(global_var[r[1]][1]))
  176.                                         elif r[1] in local_var:
  177.                                             self.jg.insert(END, str(local_var[string][1]) + str(local_var[r[1]][1]))
  178.                                         else:
  179.                                             self.jg.insert(END, r[0] + r[1])
  180.                                 else:
  181.                                     msg.showerror("Error", "NameError")
  182.                         else:
  183.                             if len(r) == 1:
  184.                                 self.jg.insert(END,string+"\n")
  185.                             if len(r) == 2:
  186.                                 if r[1] in global_var:
  187.                                         self.jg.insert(END, r[0] + str(global_var[r[1]][1]) )
  188.                                 elif r[1] in local_var:
  189.                                     yesglobal2 = local_var[r[1]][2]
  190.                                     if infunction == True:
  191.                                         if yesglobal2 == functionname or yesglobal2 == None:
  192.                                             self.jg.insert(END, r[0] + str(local_var[r[1]][1]))
  193.                                         else:
  194.                                             msg.showerror("Error", "NameError")
  195.                                     else:
  196.                                         self.jg.insert(END, r[0] + str(local_var[r[1]][1]))
  197.                                 else:
  198.                                     self.jg.insert(END,r[0]+r[1])
  199.                         commands_text.pop(0)
  200.                     elif "function:" in commands_text[0]:
  201.                         r = hhh("function:")
  202.                         try:
  203.                             function_name = r[0] # 函数名
  204.                         except:
  205.                             msg.showerror("Error", "ParameterSettingFailedError"+"\nThe Wrong: "+commands_texts[0])
  206.                         else:
  207.                             r.pop(0)
  208.                             function_parameter_drit = {} # 函数参数
  209.                             have_parameter = False
  210.                             if r == []:
  211.                                 # 如果没有设置参数,默认为 None
  212.                                 pass
  213.                             else:
  214.                                 for w4 in r:
  215.                                     function_parameter_drit[w4] = None
  216.                                 have_parameter = True
  217.                             commands_text.pop(0)
  218.                             code = []

  219.                             if commands_text[0] == "{":
  220.                                 commands_text.pop(0)
  221.                                 while commands_text[0] != "}":
  222.                                     code.append(commands_text[0].replace("\t",""))
  223.                                     commands_text.pop(0)
  224.                                     if commands_text == []:
  225.                                         msg.showerror("Error", "SyntaxError")
  226.                                 function_code_drit[function_name] = code
  227.                                 function_list.append(function_name)
  228.                                 if have_parameter == False:
  229.                                     function_drit[function_name] = None
  230.                                 else:
  231.                                     function_drit[function_name] = function_parameter_drit
  232.                                 # print(function_list,function_drit,function_code_drit)
  233.                             else:
  234.                                 msg.showerror("Error", "SyntaxError"+"\nThe Wrong: "+commands_texts[0])
  235.                             commands_text.pop(0)
  236.                     elif "value:" in commands_text[0]:
  237.                         h2 = hhh("value:")
  238.                         if len(h2) == 4:
  239.                             if h2[1] == "int":
  240.                                 try:
  241.                                     intnum = int(h2[2])
  242.                                 except:
  243.                                     msg.showerror("Error", "TypeError")
  244.                                 else:
  245.                                     if infunction == True:
  246.                                         if h2[3] == true:
  247.                                             global_var[h2[0]] = ["int",intnum,functionname]
  248.                                         elif h2[3] == false:
  249.                                             local_var[h2[0]] = ["int",intnum,functionname]
  250.                                         else:
  251.                                             msg.showerror("Error", "SyntaxError")
  252.                                     else:
  253.                                         if h2[3] == true:
  254.                                             global_var[h2[0]] = ["int",intnum,None]
  255.                                         elif h2[3] == false:
  256.                                             local_var[h2[0]] = ["int",intnum,None]
  257.                                         else:
  258.                                             msg.showerror("Error", "SyntaxError")
  259.                             elif h2[1] == "str":
  260.                                 try:
  261.                                     strnum = str(h2[2])
  262.                                 except:
  263.                                     msg.showerror("Error", "TypeError")
  264.                                 else:
  265.                                     if infunction == True:
  266.                                         if h2[3] == true:
  267.                                             global_var[h2[0]] = ["str",strnum,functionname]
  268.                                         elif h2[3] == false:
  269.                                             local_var[h2[0]] = ["str",strnum,functionname]
  270.                                         else:
  271.                                             msg.showerror("Error", "SyntaxError")
  272.                                     else:
  273.                                         if h2[3] == true:
  274.                                             global_var[h2[0]] = ["str",strnum,None]
  275.                                         elif h2[3] == false:
  276.                                             local_var[h2[0]] = ["str",strnum,None]
  277.                                         else:
  278.                                             msg.showerror("Error", "SyntaxError")
  279.                             elif h2[1] == "float":
  280.                                 try:
  281.                                     floatnum = float(h2[2])
  282.                                 except:
  283.                                     msg.showerror("Error", "TypeError")
  284.                                 else:
  285.                                     if infunction == True:
  286.                                         if h2[3] == true:
  287.                                             global_var[h2[0]] = ["float", floatnum, functionname]
  288.                                         elif h2[3] == false:
  289.                                             local_var[h2[0]] = ["float", floatnum, functionname]
  290.                                         else:
  291.                                             msg.showerror("Error", "SyntaxError")
  292.                                     else:
  293.                                         if h2[3] == true:
  294.                                             global_var[h2[0]] = ["float", floatnum, None]
  295.                                         elif h2[3] == false:
  296.                                             local_var[h2[0]] = ["float", floatnum, None]
  297.                                         else:
  298.                                             msg.showerror("Error", "SyntaxError")
  299.                             else:
  300.                                 msg.showerror("Error", "ValueError")
  301.                         else:
  302.                             msg.showerror("Error", "SyntaxError")
  303.                         commands_text.pop(0)
  304.                         print(global_var, local_var)
  305.                     elif "#" in commands_text[0]:
  306.                         hhh("#") # 行注释
  307.                         commands_text.pop(0)
  308.                     elif commands_text[0] == "":
  309.                         # 当用户为了美观不写任何代码时,忽略此行
  310.                         commands_text.pop(0)
  311.                     else:
  312.                         function_name_check = function_list.copy()
  313.                         if function_name_check != []:
  314.                             self.have = False
  315.                             while function_name_check != []:
  316.                                 if function_name_check[0] in commands_text[0]:
  317.                                     functioncode = function_code_drit[function_name_check[0]]
  318.                                     self.have = True
  319.                                     break
  320.                                 else:
  321.                                     function_name_check.pop(0)

  322.                             if self.have != False:
  323.                                 r1 = hhh(function_name_check[0]+":")
  324.                                 RunMainStartFunction(True, functioncode,function_name_check[0],r1)
  325.                                 commands_text.pop(0)
  326.                             else:
  327.                                 msg.showerror("Error", "NameError1"+"\nThe Wrong: "+commands_texts[0])
  328.                                 break
  329.                         else:
  330.                             msg.showerror("Error", "NameError"+"\nThe Wrong: "+commands_texts[0])
  331.                             break
  332.                         self.have = False

  333.             RunMainStartFunction()
  334.         # 创建文件菜单
  335.         file = Menu(mb, tearoff=False)
  336.         file.add_command(label="Open   ", command="")
  337.         file.add_command(label="Save   ", command="")
  338.         file.add_command(label="Run   ", command=run)
  339.         file.add_separator()
  340.         file.add_command(label="Exit   ", command=root.quit)
  341.         mb.add_cascade(label="  File  ", menu=file)
  342. WinMian()

  343. mainloop()
复制代码


运行后在最上边的文本文档里边儿输入此代码,可以看到解析的结果哟(可以加上缩进,[b]但注意一定要是缩进[/b]):
  1. value:e1^int^123^False
  2. function:hhh^a^b
  3. {
  4. pm:None^abcdefg
  5. printf:hello, world
  6. value:ints^int^123^False
  7. printf:ints
  8. printf:e1
  9. }

  10. # ...
  11. hhh:12
  12. printf:========

  13. function:exercise
  14. {
  15. value:e2^str^hello123456^False
  16. printf:e2
  17. printf:e1^e2
  18. }
  19. exercise:
复制代码


你也可以由此源代码继续发展,获得一个真正的编程语言。
我有注释,你可以查看代码进行继续编写




                               
登录/注册后可看大图



定义关键字的函数: hhh()
我把它单独提炼了出来
代码:
  1. # 定义关键字
  2. def hhh(name):
  3.     name_list = []
  4.     error = False
  5.     for w2 in name:
  6.         name_list.append(w2)
  7.    
  8.     """
  9.     commands_text 是一个列表是用户输入的内容。
  10.     commands_text = self.text.get("0.0","end").split("\n")
  11.     """
  12.     commandd = list(commands_text[0])
  13.     while name_list != []:
  14.     if name_list[0] == commandd[0]:
  15.         name_list.pop(0)
  16.         commandd.pop(0)
  17.     else:
  18.         msg.showerror("Error", "SyntaxError"+"\nThe Wrong: "+commands_texts[0])
  19.         error = True
  20.         break
  21.     # print(commandd)
  22.     return_list = []
  23.     if error == False:
  24.     string = ""
  25.     while commandd != []:
  26.         # print(commandd)
  27.         if commandd[0] != "^": # 我在这儿以“^”作为分隔符
  28.             string = string + commandd[0]
  29.             commandd.pop(0)
  30.    
  31.             if commandd == []:
  32.                 return_list.append(string)
  33.                 break
  34.         else:
  35.             return_list.append(string)
  36.             string = ""
  37.             commandd.pop(0)
  38.             if commandd == []:
  39.                 break
  40.    
  41.     return return_list # 返回值是一个列表
  42.     # 例如: printf:hello, world^12345
  43.     # 返回: ["hello, world", 12345]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-3 19:28:20 | 显示全部楼层
复制运行后,连续甩出7个错误。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 19:29:34 | 显示全部楼层
qiuyouzhi 发表于 2020-4-3 19:28
复制运行后,连续甩出7个错误。。。

你用的是Python3还是Python2
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 19:30:29 | 显示全部楼层
Robot_Steve 发表于 2020-4-3 19:29
你用的是Python3还是Python2

Python3鸭
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 19:31:20 | 显示全部楼层
本帖最后由 Robot_Steve 于 2020-4-3 19:32 编辑


我的是能运行的呀,要不你把错误信息发给我。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 19:33:08 | 显示全部楼层
Robot_Steve 发表于 2020-4-3 19:31
我的是能运行的呀

emmmm
{} {'e1': ['int', 123, None]}
{} {'e1': ['int', 123, None]}
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\rzzl\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "C:\Users\rzzl\Desktop\test2.py", line 350, in run
    RunMainStartFunction()
  File "C:\Users\rzzl\Desktop\test2.py", line 340, in RunMainStartFunction
    RunMainStartFunction(True, functioncode,function_name_check[0],r1)
  File "C:\Users\rzzl\Desktop\test2.py", line 141, in RunMainStartFunction
    string = r[0]
IndexError: list index out of range
还有这么一个错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 19:36:06 | 显示全部楼层
qiuyouzhi 发表于 2020-4-3 19:33
emmmm
{} {'e1': ['int', 123, None]}
{} {'e1': ['int', 123, None]}

emmmmmm
太奇怪了,我的能运行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 19:37:19 | 显示全部楼层
Robot_Steve 发表于 2020-4-3 19:36
emmmmmm
太奇怪了,我的能运行。


那好吧,我再看看别的鱼油可不可以运行
要是他们都行就是我这里的问题了
顺便问下,为啥是一本编程语言呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 19:38:26 | 显示全部楼层
qiuyouzhi 发表于 2020-4-3 19:37
那好吧,我再看看别的鱼油可不可以运行
要是他们都行就是我这里的问题了

你在里边儿输了代码是什么呀?
我这个只是,测试阶段。也许输你输的命令有一点点错误它就会报错。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 19:42:47 | 显示全部楼层
Robot_Steve 发表于 2020-4-3 19:38
你在里边儿输了代码是什么呀?
我这个只是,测试阶段。也许输你输的命令有一点点错误它就会报错。{:10_2 ...

我就直接复制了你写的代码鸭
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 19:44:40 | 显示全部楼层
qiuyouzhi 发表于 2020-4-3 19:42
我就直接复制了你写的代码鸭

我刚上网查了查。系统的不一样,有可能导致异常
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 19:45:01 | 显示全部楼层
Robot_Steve 发表于 2020-4-3 19:44
我刚上网查了查。系统的不一样,有可能导致异常


好吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 19:52:14 | 显示全部楼层
我这里运行没问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 19:54:04 | 显示全部楼层

等等,我反复试验了好几次,终于发现错误。
跟你那个错误差不多。
等一下,我解决一下。
一会儿把正常的发给你。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 19:56:47 | 显示全部楼层

你试一试这个吧:
value:e1^int^123^False
function:hhh^a^b
{
        pm:None^abcdefg
        printf:hello, world
        value:ints^int^123^False
        printf:ints
        printf:e1
}

# ...
hhh:12
printf:========

function:exercise
{
        value:e2^str^hello123456^False
        printf:e2
        printf:e1^e2
}
exercise:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 20:00:04 | 显示全部楼层
Robot_Steve 发表于 2020-4-3 19:56
你试一试这个吧:
value:e1^int^123^False
function:hhh^a^b

还是不行
算了,就这样吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 20:04:47 | 显示全部楼层
qiuyouzhi 发表于 2020-4-3 20:00
还是不行
算了,就这样吧

我终于知道了!!!!!!!!
你把里边的缩进都去掉,再试一次。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 20:32:20 | 显示全部楼层
Robot_Steve 发表于 2020-4-3 20:04
我终于知道了!!!!!!!!
你把里边的缩进都去掉,再试一次。

Wow,成功了!
谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 20:35:13 | 显示全部楼层
粘贴出来的代码,里边的缩进都不是缩进,是空格。
换算:
一个缩进  = 四个空格
四个空格 != 于四个缩进
以后像这样的代码我还是去掉缩进吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-20 00:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表