Python:
можно посмотреть на реализацию Скрученный реактор , который является, вероятно, лучшей реализацией для цикла событий в Python. Реакторы в Скрученном являются реализациями интерфейса, и можно определить реактор типа для выполнения: выберите, epoll, kqueue (все на основе c API с помощью тех системных вызовов), существуют также реакторы на основе QT и инструментариев GTK.
А простая реализация должна была бы использовать выбор:
#echo server that accepts multiple client connections without forking threads
import select
import socket
import sys
host = ''
port = 50000
backlog = 5
size = 1024
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host,port))
server.listen(backlog)
input = [server,sys.stdin]
running = 1
#the eventloop running
while running:
inputready,outputready,exceptready = select.select(input,[],[])
for s in inputready:
if s == server:
# handle the server socket
client, address = server.accept()
input.append(client)
elif s == sys.stdin:
# handle standard input
junk = sys.stdin.readline()
running = 0
else:
# handle all other sockets
data = s.recv(size)
if data:
s.send(data)
else:
s.close()
input.remove(s)
server.close()
Этот код VBA не получит награды, но он подходит для быстрого просмотра типовые формулы. Он просто делает то, что вы делали бы с скобками или разделителями вручную. Вставьте его в модуль кода и вызовите из командной строки окна VBA. (РЕДАКТИРОВАТЬ: мне недавно пришлось взглянуть на некоторые формулы, и я улучшил то, что было здесь, из моего исходного ответа, поэтому я вернулся и изменил его.)
Public Function ppf(f) As String
Dim formulaStr As String
If IsObject(f) Then
Debug.Assert TypeOf f Is Range
Dim rng As Range
Set rng = f
formulaStr = rng.Formula
Else
Debug.Assert VarType(f) = vbString
formulaStr = f
End If
Dim tabs(0 To 99) As Long
Dim tabNum As Long
tabNum = 1
Dim tabOffset As Long
Dim i As Long
Dim c As String
For i = 1 To Len(formulaStr)
c = Mid$(formulaStr, i, 1)
If InStr("({", c) > 0 Then
ppf = ppf & c
tabNum = tabNum + 1
tabs(tabNum) = tabs(tabNum - 1) + tabOffset + 1
tabOffset = 0
ppf = ppf & vbCrLf & Space(tabs(tabNum))
ElseIf InStr(")}", c) > 0 Then
tabNum = tabNum - 1
tabOffset = 0
ppf = ppf & c & vbCrLf & Space(tabs(tabNum))
ElseIf InStr("+-*/^,;", c) > 0 Then
tabOffset = 0
ppf = ppf & c & vbCrLf & Space(tabs(tabNum))
Else
ppf = ppf & c
tabOffset = tabOffset + 1
End If
Next i
End Function
Если вы назовете это так:
?ppf([q42])
вы этого не сделаете. нужно беспокоиться о том, чтобы избежать двойных кавычек и так далее. Вы получите следующий результат:
AC6+
AD6+
(
IF(
H6="Yes",
1,
IF(
J6="Yes",
1,
0)
)
)
+
IF(
X6="Yes",
1,
0)
Вы также можете вызвать его с помощью простой строки.
Вот коммерческое решение, которое может вам подойти:
http://www.uts.us.com/ItemDetails.asp?ItemID=1100-40-0000-00
Судя по всему, доступна пробная версия.