{ "info": { "author": "H.C. Chen", "author_email": "hcchen5600@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "peforth\n#######\n\nA programmable python debugger allows you to abruptly setup procedures to investigate your program code on the fly at a breakpoint.\n********************************************************************************************************************************************\n\nYou guys know how to bebug already. We all do.\nBut when it comes to Machine Learning and Tensorflow or the likes, \nthings are getting annoying. A programmable debugger is what in my mind and probably in yours too. One breakpoint to investigate about everything! At this point, you can\nthen test whatever you want, supported by all the power of FORTH.\n\nDebug commands in FORTH syntax\n##############################\n\nSo now we need to choose an interactive UI and its syntax that \nis light weight, reliable and flexible so we won't regret of choosing it \nsomeday, has been there for decades so many people don't need to learn about \nanother new language although we are only to use some debug commands, yet easy \nenough for new users, that's FORTH. \n\nInstall peforth\n###############\n\n::\n\n pip install peforth \n\nFor Jupyter Notebook users, we can use FORTH language to investigate python objects through peforth magics `%f` and `%%f`. For tutorials, please find and read jupyter notebooks in the 'notebook' directory of this project on GitHub.\n\n\nRun peforth:\n#############\n\nPrint \"Hello World!\"\n\n::\n\n Microsoft Windows [Version 10.0.15063]\n (c) 2017 Microsoft Corporation. All rights reserved.\n\n c:\\Users\\your-working-folder>python -m peforth .' Hello World!!' cr bye\n Hello World!!\n\n c:\\Users\\your-working-folder>\n\n\nso your peforth is working fine. \nTo your application, ``import peforth`` as usual to bring in the debugger:\n\n::\n\n c:\\Users\\your-working-folder>python\n Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32\n Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n >>> import peforth\n p e f o r t h v1.07\n source code http://github.com/hcchengithub/peforth\n Type 'peforth.ok()' to enter forth interpreter, 'exit' to come back.\n\n >>>\n\n\nThe greeing message tells us how to enter the FORTH interpreter for your \ndebugging or investigating and how to come back to continue running your \ncode. \n\nLet's try to debug a program\n############################\n\n::\n\n # 100.py\n\n sum = 0\n for i in range(100):\n sum += i\n print(\"The sum of 1..100 is \", sum)\n\n\nRun it:\n\n::\n\n c:\\Users\\your-working-folder>python 100.py\n The sum of 1..100 is 4950\n\n c:\\Users\\your-working-folder>\n\nThe result should be 5050 but it's not! Let's drop a breakpoint \nto see what's wrong:\n\n::\n\n # 100.py with breakpoing .----- Specify an unique command prompt to indicate where \n | the breakpoint is from if there are many of them\n import peforth | .----- pass locals() at the breakpoint\n sum = 0 | | to our debugger\n for i in range(100): | | .------- use a FORTH constant \n sum += i | | | to represent the locals()\n peforth.ok('my first breakpoint> ',loc=locals(),cmd=\"constant locals-after-the-for-loop\")\n print(\"The sum of 1..100 is \", sum)\n\n\nRun again:\n\n::\n\n c:\\Users\\your-working-folder>python 100.py\n p e f o r t h v1.07\n source code http://github.com/hcchengithub/peforth\n Type 'peforth.ok()' to enter forth interpreter, 'exit' to come back.\n\n .--------------- at the breakpoint, type in 'words' \n | command to see what have we got \n my first breakpoint> words .-------- It's a long list of 'words'\n ... snip ....... | or available commands. Don't worry, we'll use only some of them.\n expected_rstack expected_stack test-result [all-pass] *** all-pass [r r] [d d] [p \n p] WshShell inport OK dir keys --- locals-after-the-for-loop\n |\n The last one is what ------' \n we have just created throuth the breakpoint statement \n , named \"locals-after-the-for-loop\"\n\nLet's see it:\n\n::\n\n print a carriage return at the end -------.\n print the thing -----. | \n | |\n my first breakpoint> locals-after-the-for-loop . cr\n ({'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': \n <_frozen_importlib_external.SourceFileLoader object at 0x000001DD2D737710>, \n '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '100.py', '__cached__': None, 'peforth': , 'sum': 4950, 'i': 99}, {}, 'my first breakpoint> ')\n my first breakpoint> | | |\n | | '--- our command\n our sum -----' | prompt\n | indicates where the \n 99 instead of 100 ----------' breakpoint is from\n this is the problem !! \n\n\nNow leave the breakpoint and let the program continue:\n\n::\n\n my first breakpoint> exit\n my first breakpoint> The sum of 1..100 is 4950\n\n c:\\Users\\your-working-folder>\n\n\nInvestigate by doing experiments right at a breakpoint\n######################################################\n\nWhen at a breakpoint in Tensorfow tutorials, I always want to\nmake some experiments on those frustrating *tf.something(tf.something(...),...)*\nthings to have a clearer understanding of them \nwithout leaving the underlying tutorial. Let's use the above example\nagain in another way to demonstrate how to do that with peforth: \n\nRun peforth:\n\n::\n\n Microsoft Windows [Version 10.0.15063]\n (c) 2017 Microsoft Corporation. All rights reserved.\n\n c:\\Users\\your-working-folder>python\n Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32\n Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n >>> import peforth\n p e f o r t h v1.07\n source code http://github.com/hcchengithub/peforth\n Type 'peforth.ok()' to enter forth interpreter, 'exit' to come back.\n\n >>> peforth.ok()\n\n OK <-------- Default FORTH command prompt\n OK \n\nAssume we are at a breakpoint and we need a procedure to\nadd 1..100 to get the sum of them. We are not sure if the procedure\nis correct so we need to try. Now copy the procedure from \nyour text editor. The ``` ... ``` tells the debugger that \nthe code within is a block of in-line python. \nThe ```outport()``` function outports the given ```locals()``` to the\nFORTH environment outside the in-line python block.\n\n::\n\n \n sum = 0\n for i in range(100):\n sum += i\n print(\"The sum of 1..100 is \", sum)\n outport(locals())\n \n\nIt's a block of multiple-line text strings so we press Ctrl-D\nto start a multiple-line input, copy-paste, and press another Ctrl-D\nto end the multiple-line block. Like this:\n\n::\n\n OK\n OK ^D\n \n sum = 0\n for i in range(100):\n sum += i\n print(\"The sum of 1..100 is \", sum)\n outport(locals())\n \n ^D\n The sum of 1..100 is 4950\n OK\n\nNow use the 'words' command to see what have we got:\n\n::\n\n OK words\n code end-code \\ // bye /// immediate stop compyle \n trim indent -indent words . cr help interpret-only \n compile-only literal reveal privacy (create) : ; ( BL CR word ' , \n [compile] py: py> py:~ py>~ 0branch here! here swap ! @ ? >r r> r@ drop \n dup over 0< + * - / 1+ 2+ 1- 2- compile if then compiling char last \n version execute cls private nonprivate (space) exit ret rescan-word-hash \n (') branch bool and or not (forget) AND OR NOT XOR true false \"\" [] {} \n none >> << 0= 0> 0<> 0<= 0>= = == > < != >= <= abs max min doVar doNext \n depth pick roll space [ ] colon-word create (marker) marker next abort \n alias <> public nip rot -rot 2drop 2dup invert negate within ['] allot \n for begin until again ahead never repeat aft else while ?stop ?dup \n variable +! chars spaces .( .\" .' s\" s' s` does> count accept accept2 \n nop refill [else] [if] [then] (::) (:>) :: :> ::~ \n :>~ \"msg\"abort abort\" \"msg\"?abort ?abort\" ' () \n (constant) constant value to tib. >t t@ t> [begin] \n [again] [until] [for] [next] modules int float drops dropall char>ASCII \n ASCII>char ASCII .s (*debug*) *debug* readTextFile writeTextFile \n tib.insert sinclude include type obj>keys obj2dict stringify toString \n .literal .function (dump) dump dump2ret d (see) .members .source see dos \n cd slice description expected_rstack expected_stack test-result \n [all-pass] *** all-pass [r r] [d d] [p p] WshShell inport OK dir keys \n --- i sum\n OK\n\nAround the end of the long list after the ``` --- ``` marker we found ``` i ``` and \n``` sum ```. They are all locals() at the point in the in-line python block.\nLet's see them:\n\n::\n\n OK i . cr\n 99\n OK sum . cr\n 4950\n OK\n\nAgain, we found the root cause of why the sum is not 5050 because\n``` i ``` didn't reach to 100 as anticipated. That's exactly how the \npython ```range()``` works and that has actually confused me many times.\n\n\nVisit this project's \n`Wiki`_\npages\nfor more examples about how to view MNIST handwritten digit images\nat the half way of your investigating in a Tensorflow tutorial, for\nexample, and the usages of this programmable debugger.\n\nHave fun!\n*********\n\n- H.C. Chen, FigTaiwan, 2019.5.22\n- hcchen5600@gmail.com\n- Just undo it! \n\nEdited by: `rst online editor`_\n\n.. _Wiki: https://github.com/hcchengithub/peforth/wiki\n.. _rst online editor: http://rst.ninjs.org\n.. _Jupyter Notebook: http://nbviewer.jupyter.org/\n.. _Linux Users: http://robl.co/brainfuck-ipython/\n\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/hcchengithub/peforth", "keywords": "", "license": "The MIT License (MIT) Copyright \u00a9 2017 H.C. Chen", "maintainer": "", "maintainer_email": "", "name": "peforth", "package_url": "https://pypi.org/project/peforth/", "platform": "", "project_url": "https://pypi.org/project/peforth/", "project_urls": { "Homepage": "https://github.com/hcchengithub/peforth" }, "release_url": "https://pypi.org/project/peforth/1.23/", "requires_dist": null, "requires_python": "", "summary": "A programmable debugger in FORTH syntax. Set one breakpoint to X-ray everything.", "version": "1.23" }, "last_serial": 5301531, "releases": { "1.11": [ { "comment_text": "", "digests": { "md5": "bb28fbb236a93d572bda57575adf25d3", "sha256": "eb9efc957f3e42d0fdee9b9055af4c400e53fa1727bdebe0050f6e6e75393d11" }, "downloads": -1, "filename": "peforth-1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "bb28fbb236a93d572bda57575adf25d3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 48257, "upload_time": "2017-11-03T09:14:06", "url": "https://files.pythonhosted.org/packages/64/4f/87dbe59af58ab414d825ec5874f5624197b5ecc3c084b726ac2a745a6ec1/peforth-1.11-py3-none-any.whl" } ], "1.13": [ { "comment_text": "", "digests": { "md5": "26c9ea71c8345bd5c4e1f88a66d71f2b", "sha256": "29e6bb74995567ec775c98e1972ffba5328652aebf3d103c7cb7b483addac3a4" }, "downloads": -1, "filename": "peforth-1.13-py3-none-any.whl", "has_sig": false, "md5_digest": "26c9ea71c8345bd5c4e1f88a66d71f2b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 51311, "upload_time": "2017-12-27T08:47:24", "url": "https://files.pythonhosted.org/packages/f5/6a/abb16c2179c60a53da745ae560e1da226f615f51dc49632b60a16ed8d6fd/peforth-1.13-py3-none-any.whl" } ], "1.14": [ { "comment_text": "", "digests": { "md5": "ab0b67f6084d14333f137ce5316b3f74", "sha256": "e5873413230a6782c644aef1e472d93fe421e576c4fd23ee9beab02a40ec113e" }, "downloads": -1, "filename": "peforth-1.14-py3-none-any.whl", "has_sig": false, "md5_digest": "ab0b67f6084d14333f137ce5316b3f74", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 51692, "upload_time": "2018-01-21T09:19:39", "url": "https://files.pythonhosted.org/packages/cc/00/d204c24db52d1aa56d39d586676d401c805c1c299a68e5565b55312ed734/peforth-1.14-py3-none-any.whl" } ], "1.15": [ { "comment_text": "", "digests": { "md5": "bec605c2c77ad279c1d2fd7e4b1efb3c", "sha256": "8c80fb3d84a36bef39693929e011720e47d3764e5e852e90800a42a0c3dfde96" }, "downloads": -1, "filename": "peforth-1.15-py3-none-any.whl", "has_sig": false, "md5_digest": "bec605c2c77ad279c1d2fd7e4b1efb3c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 52396, "upload_time": "2018-03-12T11:27:39", "url": "https://files.pythonhosted.org/packages/7c/12/60d90343cf8002a4cfdd613c76f15068a6dfea89e4c9e52e7eca34cd1ca3/peforth-1.15-py3-none-any.whl" } ], "1.16": [ { "comment_text": "", "digests": { "md5": "75a095a152f3ac30a0c0c3b181458d05", "sha256": "0b182f77f55d6bcd94c85b22b29abe9e31e29308519ee6e16d6006f5c6cf16aa" }, "downloads": -1, "filename": "peforth-1.16-py3-none-any.whl", "has_sig": false, "md5_digest": "75a095a152f3ac30a0c0c3b181458d05", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 53192, "upload_time": "2018-05-22T08:02:24", "url": "https://files.pythonhosted.org/packages/eb/29/12a274ce4900291bfa4b60435520403f49d0739cb6cdc3ac897e9d0df0b5/peforth-1.16-py3-none-any.whl" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "fe5891bd7cf705ba558e635332d92c47", "sha256": "2432543d3dc39fdb4210af09554ac0551eb58580d86bcf7baa8818330b02a33f" }, "downloads": -1, "filename": "peforth-1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "fe5891bd7cf705ba558e635332d92c47", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 48860, "upload_time": "2017-09-08T12:51:48", "url": "https://files.pythonhosted.org/packages/c5/dc/4f6883f084895e710e81603b187d360c1e9a54d47079b9611b771239b882/peforth-1.2-py3-none-any.whl" } ], "1.21": [ { "comment_text": "", "digests": { "md5": "38390ffab7a69e85e405b9fb59396e63", "sha256": "362edcdf8ba166651cb47688089f8bc9064106ac300024fad52d229849c6edbc" }, "downloads": -1, "filename": "peforth-1.21-py3-none-any.whl", "has_sig": false, "md5_digest": "38390ffab7a69e85e405b9fb59396e63", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 51551, "upload_time": "2018-07-02T12:00:27", "url": "https://files.pythonhosted.org/packages/57/76/038666f8eceaddb3113062091baf90acfe6337a1a57ee02ac15da735428b/peforth-1.21-py3-none-any.whl" } ], "1.23": [ { "comment_text": "", "digests": { "md5": "b0f8c110192d6981a4f233dbcdc5a765", "sha256": "bad337bc13ebb0dc66819236c37d7ceb77eeade5bc8550c069f5efcd15c271ea" }, "downloads": -1, "filename": "peforth-1.23-py3.6.egg", "has_sig": false, "md5_digest": "b0f8c110192d6981a4f233dbcdc5a765", "packagetype": "bdist_egg", "python_version": "3.6", "requires_python": null, "size": 59723, "upload_time": "2019-05-22T08:27:07", "url": "https://files.pythonhosted.org/packages/9c/f3/463295c4268dd807f17719578c52ffec04965ca2533a03bf4d61d16903c9/peforth-1.23-py3.6.egg" }, { "comment_text": "", "digests": { "md5": "b8bcd28dbda13c5359ef089026f4b928", "sha256": "0f3684782e7666f62bd6eed471982a038226b7529266ab6de59f8c2ba90acffd" }, "downloads": -1, "filename": "peforth-1.23-py3-none-any.whl", "has_sig": false, "md5_digest": "b8bcd28dbda13c5359ef089026f4b928", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 54986, "upload_time": "2019-05-22T08:27:05", "url": "https://files.pythonhosted.org/packages/ad/8a/dd35cd7f98a34947cd46055af998dbe2681b46592eae1dcca574ac3d27c2/peforth-1.23-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ca11b62e551a358dd02fd30a19844c4", "sha256": "8cd12ba6d5fa98163cfe995da40a4968ca38eff140261acb28beb9539e45fcbc" }, "downloads": -1, "filename": "peforth-1.23.tar.gz", "has_sig": false, "md5_digest": "2ca11b62e551a358dd02fd30a19844c4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47140, "upload_time": "2019-05-22T08:27:09", "url": "https://files.pythonhosted.org/packages/af/b7/b501089e1678626ff30b381aa0b7aa5fa05216712f3669352b798a032164/peforth-1.23.tar.gz" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "97c6138652b943f1da6a30d268dfbfe6", "sha256": "0cbe6094671fa14ff99eb61e894574f35c1c17068eba1ae4dab2a135fe061fe2" }, "downloads": -1, "filename": "peforth-1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "97c6138652b943f1da6a30d268dfbfe6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 49389, "upload_time": "2017-09-14T07:06:20", "url": "https://files.pythonhosted.org/packages/a5/04/c0658c1518b6fee8019f0c83935af3e48a8d6fcc6e6c92cee5661d2cc95f/peforth-1.3-py3-none-any.whl" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "5e37fdf6c893b46f61c5865ef24ea2ca", "sha256": "e0e8a674b3eda9327ec4acdb85b652e29b6ffd354fa6be0e8ef922c98dcb60ae" }, "downloads": -1, "filename": "peforth-1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "5e37fdf6c893b46f61c5865ef24ea2ca", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 44579, "upload_time": "2017-09-20T10:35:39", "url": "https://files.pythonhosted.org/packages/ee/82/a7ebb6287bc8048cc8a6ac7587ffd3268699950969afa7aecd4ecc07e1f8/peforth-1.4-py3-none-any.whl" } ], "1.5": [ { "comment_text": "", "digests": { "md5": "ce93b2c5e7572026d85a5199e814e9ae", "sha256": "aad9f0473099227ce3cbd305b89e6523c2fc181f9e6224b3d2b60c16957e756a" }, "downloads": -1, "filename": "peforth-1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "ce93b2c5e7572026d85a5199e814e9ae", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 43601, "upload_time": "2017-09-22T08:09:22", "url": "https://files.pythonhosted.org/packages/58/2b/4773b9bee61b7c025df16f2a28a29c37d4c20c6198c203a8cf178574be3d/peforth-1.5-py3-none-any.whl" } ], "1.6": [ { "comment_text": "", "digests": { "md5": "cf8bb30cb6d7b1fbb680132f2efca6b4", "sha256": "ee2666dc5085ad775279ad70e7338e19150e7db1bf0d347394cf15f25eac7f8e" }, "downloads": -1, "filename": "peforth-1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "cf8bb30cb6d7b1fbb680132f2efca6b4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 45527, "upload_time": "2017-10-02T15:33:23", "url": "https://files.pythonhosted.org/packages/a5/d4/37772671a9fc7e7ec96a51b40ac0c16e0becf0414173b486033ba57d56f3/peforth-1.6-py3-none-any.whl" } ], "1.7": [ { "comment_text": "", "digests": { "md5": "8a246c37b82b00c5dbfaad5abd92f4bf", "sha256": "4cef82c44b1ff1c14b64f03bec40b2c6495dda82535cef405b01c9422a5c6a13" }, "downloads": -1, "filename": "peforth-1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "8a246c37b82b00c5dbfaad5abd92f4bf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 46638, "upload_time": "2017-10-08T11:34:33", "url": "https://files.pythonhosted.org/packages/25/14/f231363476ebcf56b271d72134d873c3ebb436b6ccf9fc334322fb94f420/peforth-1.7-py3-none-any.whl" } ], "1.8": [ { "comment_text": "", "digests": { "md5": "b009edcdfd6c1f31344c0b36cc1211b7", "sha256": "bbef505dee13b1576c5cc63635f9ff858189fa7c29ba507597888278c5409c5e" }, "downloads": -1, "filename": "peforth-1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "b009edcdfd6c1f31344c0b36cc1211b7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 47154, "upload_time": "2017-10-11T02:39:37", "url": "https://files.pythonhosted.org/packages/91/c5/02a58eb2dc488fea360039a7025f66bd9f6d47ee6e45e13f1db6adaaa317/peforth-1.8-py3-none-any.whl" } ], "1.9": [ { "comment_text": "", "digests": { "md5": "67c484e73c23b94be8f175df5a46c086", "sha256": "2abc051393f3362aab130d54d18fd08673f10555e4cfe70b24741f2eb6695fcd" }, "downloads": -1, "filename": "peforth-1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "67c484e73c23b94be8f175df5a46c086", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 47552, "upload_time": "2017-10-19T04:08:49", "url": "https://files.pythonhosted.org/packages/99/56/550f0ca9a406622996ddfd7c0b94430a41a704321b9d95e21a322881f7c6/peforth-1.9-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b0f8c110192d6981a4f233dbcdc5a765", "sha256": "bad337bc13ebb0dc66819236c37d7ceb77eeade5bc8550c069f5efcd15c271ea" }, "downloads": -1, "filename": "peforth-1.23-py3.6.egg", "has_sig": false, "md5_digest": "b0f8c110192d6981a4f233dbcdc5a765", "packagetype": "bdist_egg", "python_version": "3.6", "requires_python": null, "size": 59723, "upload_time": "2019-05-22T08:27:07", "url": "https://files.pythonhosted.org/packages/9c/f3/463295c4268dd807f17719578c52ffec04965ca2533a03bf4d61d16903c9/peforth-1.23-py3.6.egg" }, { "comment_text": "", "digests": { "md5": "b8bcd28dbda13c5359ef089026f4b928", "sha256": "0f3684782e7666f62bd6eed471982a038226b7529266ab6de59f8c2ba90acffd" }, "downloads": -1, "filename": "peforth-1.23-py3-none-any.whl", "has_sig": false, "md5_digest": "b8bcd28dbda13c5359ef089026f4b928", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 54986, "upload_time": "2019-05-22T08:27:05", "url": "https://files.pythonhosted.org/packages/ad/8a/dd35cd7f98a34947cd46055af998dbe2681b46592eae1dcca574ac3d27c2/peforth-1.23-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ca11b62e551a358dd02fd30a19844c4", "sha256": "8cd12ba6d5fa98163cfe995da40a4968ca38eff140261acb28beb9539e45fcbc" }, "downloads": -1, "filename": "peforth-1.23.tar.gz", "has_sig": false, "md5_digest": "2ca11b62e551a358dd02fd30a19844c4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47140, "upload_time": "2019-05-22T08:27:09", "url": "https://files.pythonhosted.org/packages/af/b7/b501089e1678626ff30b381aa0b7aa5fa05216712f3669352b798a032164/peforth-1.23.tar.gz" } ] }