Programming language for self-modifying code?

后端 未结 14 1834
别那么骄傲
别那么骄傲 2020-12-23 13:05
  • I am recently thinking about writing self-modifying programs, I think it may be powerful and fun. So I am currently looking for a language that allows
14条回答
  •  青春惊慌失措
    2020-12-23 13:35

    I wrote Python class Code that enables you to add and delete new lines of code to the object, print the code and excecute it. Class Code shown at the end.

    Example: if the x == 1, the code changes its value to x = 2 and then deletes the whole block with the conditional that checked for that condition.

    #Initialize Variables
    x = 1
    
    #Create Code
    code = Code()
    code + 'global x, code' #Adds a new Code instance code[0] with this line of code => internally             code.subcode[0]
    code + "if x == 1:"     #Adds a new Code instance code[1] with this line of code => internally code.subcode[1]
    code[1] + "x = 2"       #Adds a new Code instance 0 under code[1] with this line of code => internally code.subcode[1].subcode[0]
    code[1] + "del code[1]" #Adds a new Code instance 0 under code[1] with this line of code => internally code.subcode[1].subcode[1]
    

    After the code is created you can print it:

    #Prints
    print "Initial Code:"
    print code
    print "x = " + str(x)
    

    Output:

    Initial Code:
    
    global x, code
    if x == 1:
        x = 2
        del code[1]
    
    x = 1
    

    Execute the cade by calling the object: code()

    print "Code after execution:"
    code() #Executes code
    print code
    print "x = " + str(x)
    

    Output 2:

    Code after execution:
    
    global x, code
    
    x = 2
    

    As you can see, the code changed the variable x to the value 2 and deleted the whole if block. This might be useful to avoid checking for conditions once they are met. In real-life, this case-scenario could be handled by a coroutine system, but this self modifying code experiment is just for fun.

    class Code:
    
        def __init__(self,line = '',indent = -1):
    
            if indent < -1:
                raise NameError('Invalid {} indent'.format(indent))
    
            self.strindent = ''
            for i in xrange(indent):
                self.strindent = '    ' + self.strindent
    
            self.strsubindent = '    ' + self.strindent
    
            self.line = line
            self.subcode = []
            self.indent = indent
    
    
        def __add__(self,other):
    
            if other.__class__ is str:
                other_code = Code(other,self.indent+1)
                self.subcode.append(other_code)
                return self
    
            elif other.__class__ is Code:
                self.subcode.append(other)
                return self
    
        def __sub__(self,other):
    
            if other.__class__ is str:
                for code in self.subcode:
                    if code.line == other:
                        self.subcode.remove(code)
                        return self
    
    
            elif other.__class__ is Code:
                self.subcode.remove(other)
    
    
        def __repr__(self):
            rep = self.strindent + self.line + '\n'
            for code in self.subcode: rep += code.__repr__()
            return rep
    
        def __call__(self):
            print 'executing code'
            exec(self.__repr__())
            return self.__repr__()
    
    
        def __getitem__(self,key):
            if key.__class__ is str:
                    for code in self.subcode:
                        if code.line is key:
                            return code
            elif key.__class__ is int:
                return self.subcode[key]
    
        def __delitem__(self,key):
            if key.__class__ is str:
                for i in range(len(self.subcode)):
                    code = self.subcode[i]
                    if code.line is key:
                        del self.subcode[i]
            elif key.__class__ is int:
                del self.subcode[key]
    

提交回复
热议问题